想象一下,我有一個有序的 std::vectorA = {x1, x2, ..., xn}并且我想對每個后續的專案對執行一個操作,例如f(x1, x2); f(x2, x3); ... f(xn-1, xn); f(xn, x1).
我可以像往常一樣迭代,同時跟蹤上一個專案:
for (auto x : A) {
...
f(previous_x, x);
previous_x = x;
}
f(previous_x, first_x);
但是有沒有更好的方法來遍歷這個向量呢?語言中是否有可以簡化這一點的功能?
嘗試了提供的解決方案。它有效,但很想知道是否有更簡潔、更簡潔的方法。
uj5u.com熱心網友回復:
給你
std::vector<int> v = { 1, 2, 3, 4, 5 };
for (std::vector<int>::size_type i = 0, n = std::size( v ); i < n; i )
{
std::cout << v[i] v[( i 1 ) % n] << ' ';
}
std::cout << '\n';
此代碼片段的輸出是
3 5 7 9 6
您可以使用類似的方法。
在 for 回圈之前,您可以檢查一個向量是否至少包含兩個元素。
uj5u.com熱心網友回復:
您可以使用老式的基于非范圍的 for 回圈并取消參考當前 下一個模數A.size()迭代器:
#include <iostream>
#include <vector>
void foo(int a, int b) { std::cout << a << ',' << b << '\n'; }
int main() {
std::vector<int> A{1, 2, 3};
if (A.size() >= 2) {
for (auto it = A.begin(); it != A.end(); it) {
foo(*it, *std::next(A.begin(),
(std::distance(A.begin(), it) 1) % A.size()));
}
}
}
輸出:
1,2
2,3
3,1
或者...使用索引做同樣的事情,就像@Vlad 展示的那樣。
uj5u.com熱心網友回復:
范圍為這種情況提供了一個漂亮的解決方案:
- 得到輸入向量 (
12345), - 無限期地重復它 (
12345123451...), 123451取與向量大小加一 ( )一樣多的元素,- 通過從前兩個元素的視窗開始并將其滑動到末尾 (
12,23...,51) 創建一個對矢量,最后, - 對每一對應用轉換。
我使用了 Eric Niebler 的 range-v3 庫,因為std::views::cycle它還沒有進入 C 23 范圍。
[演示]
#include <fmt/ranges.h>
#include <functional> // multiplies, plus
#include <range/v3/all.hpp>
#include <vector>
template <typename C, typename F>
auto my_adjacent_transform(const C& c, F&& f) {
return c
| ranges::views::cycle
| ranges::views::take(c.size() 1)
| ranges::views::sliding(2)
| ranges::views::transform([&f](auto&& p) {
return std::forward<F>(f)(p[0], p[1]);
});
}
int main() {
std::vector<int> v{ 1, 2, 3, 4, 5 };
fmt::print("v: {}\n", v);
fmt::print("Adding pairs: {}\n", my_adjacent_transform(v, std::plus<>{}));
auto w{ my_adjacent_transform(v, std::multiplies<>{})
| ranges::to<std::vector<int>>()
};
fmt::print("Multiplying pairs: {}\n", w);
}
// Outputs:
//
// v: [1, 2, 3, 4, 5]
// Adding pairs: [3, 5, 7, 9, 6]
// Multiplying pairs: [2, 6, 12, 20, 5]
uj5u.com熱心網友回復:
去做就對了:
A.push_back(A[0]); // copy first element to end
for (int j = 0; j < A.size() - 1; j)
f(A[j], A[j 1]);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/535450.html
