C++ - 将 double vector 作为元组迭代

标签 c++ vector stl iterator c++17

我有一个 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/

    相关文章:

    python - 在 MacOS 上创建一个 dylib 文件以与 Steamworks API 的 Python 包装器一起使用

    c++ - std::deque 的排序是如何实现的?

    c++ - Vector.erase(Iterator) 导致错误的内存访问

    C++11:迭代时从 std::unordered_map 中删除单个元素是否安全?

    c++ - 将程序链接到静态库,将自身链接到另一个库

    c++ - 在C++中将数组打印为表格

    c++ - CWinApp CFrameWindow 未显示

    c++ - 如何从数组类中删除元素

    c++ - STL 中的迭代器指针如何工作

    c++ - 使用 C++ 的 STL 进行第 i 个顺序统计