You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何遍历std::vector处理连续元素及首尾配对并避免代码重复

解决std::vector循环配对的代码重复问题

你需要收集vector中连续元素对,再加上最后一个元素与第一个元素的配对,同时避免重复的操作逻辑。可以通过循环遍历所有元素,利用模运算获取下一个元素(包括首尾循环的情况),把所有配对逻辑整合到同一个循环里。

修改后的代码示例

#include <vector>
#include <iostream>

int main()
{
    auto v = std::vector<int>{1,3,4,2};
    auto vecOfPairs = std::vector<std::pair<int,int>>{};

    const size_t size = v.size();
    for (size_t i = 0; i < size; ++i)
    {
        auto a = v[i];
        auto b = v[(i + 1) % size]; // 模运算实现循环,最后一个元素的下一个是第一个元素
        // 对a和b执行统一的操作
        vecOfPairs.emplace_back(a, b);
    }

    for (const auto& pair : vecOfPairs)
        std::cout << pair.first << ", " << pair.second << '\n';
}

逻辑说明

  • 循环次数等于vector的元素个数,覆盖所有需要的配对:(1,3)、(3,4)、(4,2)、(2,1)
  • 使用(i + 1) % size计算下一个元素的索引,当i是最后一个元素的索引时,(i+1)%size等于0,也就是第一个元素的索引,完美实现首尾配对
  • 所有配对的操作逻辑都在同一个循环中完成,彻底消除代码重复

如果偏好使用迭代器而非索引,也可以这样实现:

#include <vector>
#include <iostream>

int main()
{
    auto v = std::vector<int>{1,3,4,2};
    auto vecOfPairs = std::vector<std::pair<int,int>>{};

    if (v.empty()) return 0; // 空容器边界处理

    auto it = v.begin();
    const auto end = v.end();
    const auto first = v.begin();
    do {
        auto a = *it;
        auto next_it = std::next(it);
        auto b = (next_it == end) ? *first : *next_it;
        // 对a和b执行统一的操作
        vecOfPairs.emplace_back(a, b);
        ++it;
    } while (it != end);

    for (const auto& pair : vecOfPairs)
        std::cout << pair.first << ", " << pair.second << '\n';
}

内容的提问来源于stack exchange,提问作者Morpheus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 00:20:52