代码之家  ›  专栏  ›  技术社区  ›  Morpheus

i在std::vector上迭代一次两个元素加上最后一个和第一个元素

c++
  •  1
  • Morpheus  · 技术社区  · 3 年前

    我试图在一个向量上迭代,比如{1,3,4,2},并收集基本上是(1,3)、(3,4),(4,2)、(2,1)的对。收集前三双很容易,但做最后一双有点困难。

    这就是我所拥有的:

    #include <vector>
    #include <iostream>
    
    int main()
    {
        auto v = std::vector<int>{1,3,4,2};
        auto vecOfPairs = std::vector<std::pair<int,int>>{};
    
        for ( auto it = v.begin(); it != v.end() - 1; ++it)
        {
            auto a = *it;
            auto b = *(it+1);
            // DO some stuff with a and b
            vecOfPairs.push_back(std::make_pair(a, b));
        }
    
        auto front = v.front(); 
        auto back = v.back();
        // Do the same some stuff with front and back
        vecOfPairs.push_back(std::make_pair(back, front));
    
        for (const auto& pair : vecOfPairs)
            std::cout << pair.first << ", " << pair.second << '\n';
    
    }
    

    虽然这是有效的,但也有一些代码重复(一旦我有了这两个值,我会在配对并将其推送到向量之前对这两个数值进行进一步的计算。有没有办法避免这种情况,只在相同的for循环中进行最后一次操作?)?

    2 回复  |  直到 3 年前
        1
  •  2
  •   Ted Lyngmo    3 年前

    如果使用纯下标,则会更简单。然后你可以加1,用 % v.size() :

    for(size_t i = 0; i < v.size(); ++i) {
        vecOfPairs.emplace_back(v[i], v[(i + 1) % v.size()]);
    }
    
        2
  •  1
  •   cptFracassa    3 年前

    如果你不想像Ted的回答那样使用raw-for-loop(有充分的理由避免使用raw-for loop),你可以这样做:

    for ( auto it = v.begin(); it != v.end(); ++it)
    {
        auto it2 = it + 1;
        if (it2 == v.end()) 
        {
            it2 = v.begin();
        }
    
        vecOfPairs.emplace_back(*it, *it2);
    }