首页 > 解决方案 > 有没有办法在不使用两个 for 循环的情况下迭代两个容器

问题描述

有没有办法在不使用两个 for 循环的情况下迭代两个容器(一个接着另一个)。

我的意图是做这样的事情

vector<int> a{ 1,2,3 };
vector<int> b{ 4,5,6 };

auto it = a.begin();
auto end = b.end();

for (; it != end; ++it)
{
    if (it == a.end())
    {
        it = b.begin();
    }
    // do something with *it
}

打印

1 2 3 4 5 6

(当然它不起作用。解释在这个答案中)

我不想编写两个 for 循环并在循环内复制代码。有没有一种方法可以迭代,a然后b使用一个 for 循环?

我唯一能想到的是将第二个容器复制/移动到第一个容器,或者创建一个结合aand的新向量b,然后对其进行迭代。我也不想这样做,因为这将意味着昂贵的复制操作。

标签: c++c++11c++14c++17

解决方案


使用range-v3,您可以在 C++17 或更早版本中使用范围相关的所有内容:

for (int i : view::concat(a, b)) {
    std::cout << i << ' ';
}

推荐阅读