我有一个 double 的 C++ vector ,它保证有偶数个元素。这个 vector 将一组点的坐标存储为 x, y 坐标:
A[2 * i ] 是第 i 个点的 x 坐标。
A[2 * i + 1] 是第 i 个点的 y 坐标。
如何实现允许我使用 STL 样式算法的迭代器(一个采用迭代器范围的算法,其中取消引用迭代器会返回与对应点的 x、y 坐标相对应的一对 double 值)?
如果有帮助,我正在使用 C++17。
最佳答案
我们可以使用带有两个适配器的 range-v3:
chunk(n)
获取一个范围并将其调整为大小不重叠的范围 n
transform(f)
取范围 x
并将其调整为 f(x)
的范围将它们放在一起,我们可以创建一个适配器,它接受一个范围并产生一系列非重叠对:
auto into_pairs = rv::chunk(2)
| rv::transform([](auto&& r){ return std::pair(r[0], r[1]); });
使用 r[0]
语法假定输入范围是随机访问的,在这种情况下这很好,因为我们知道我们想在 vector
上使用它,但它也可以推广到仅用于前向范围,但需要更多语法:| rv::transform([](auto&& r){
auto it = ranges::begin(r);
auto next = ranges::next(it);
return std::pair(*it, *next);
})
Demo , 使用 fmt
为方便打印:int main() {
std::vector<int> v = {1, 1, 2, 2, 3, 3, 4, 4, 5, 5};
auto into_pairs = rv::chunk(2)
| rv::transform([](auto&& r){ return std::pair(r[0], r[1]); });
// prints {(1, 1), (2, 2), (3, 3), (4, 4), (5, 5)}
fmt::print("{}\n", v | into_pairs);
}
从问题中不清楚您是否想要
pair<T, T>
s 或 pair<T&, T&>
s。后者可以通过向 std::pair
提供显式类型来实现。而不是依赖类模板参数推导。
关于C++ - 将 double vector 作为元组迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67152606/