如何在重复循环中循环std :: vector

时间:2017-08-02 17:11:19

标签: c++ c++11 vector stdvector

我正在使用{ "metadata" :{ "status": "active", "msg": "my_message" }, "data" :{ "id": 1001, "name": "Bob" } } std::vector来存储一些商品和商品稍后检索它们。以下是我如何迭代我的向量。

C++

我需要每次迭代索引。因此,如上所示,每次迭代获取它。

上面的循环效果很好但我想要以无限循环遍历向量。我怎么能这样做?

现在,我明白问题来了,如果让它在重复循环中运行,如何停止运行循环。我想用一个std::vector<some_object> some_vector; some_vector.resize(10); for (auto it = some_vector.begin(); it != some_vector.end(); ++it) { int current_it_index = std::distance(some_vector.begin(), it); } 作为变量来发出信号&amp;打破了应该运行良好的循环?

PS:请注意我已将std::atomic<bool>作为示例容器来解释问题。如果建议的解决方案也适用于std::vector或其他容器,那就太棒了。

3 个答案:

答案 0 :(得分:3)

std::vector<some_object> some_vector;
some_vector.resize(10);
bool quit = false;
while (!quit) {
  for (auto& e:some_vector) {
    if (quit) break;
    std::size_t i = std::addressof(e)-some_vector.data();
    // ...
  }
}

答案 1 :(得分:1)

迭代具有2个元素数量的数组的常见技巧是简单地迭代计数器并使用掩码操作。

size_t counter = 0;
const size_t mask = some_vector.size() - 1U;

while (!quit) {
    size_t i = counter++ & mask;
    do_something(some_vector[i]);
}

如果数组不是2的幂,你可以执行模运算而不是屏蔽自由运行的计数器。

size_t i = 0;
const size_t n = some_vector.size();

while (!quit) {
    do_something(some_vector[i++]);
    i %= n;
}

如果您使用的是非随机访问容器,并且需要迭代器和索引,那么您可以实现两个循环。这样可以避免在非随机访问迭代器上计算distance的费用。

for (;;) {
    size_t idx = 0;
    for (auto it = some_container.begin();
         it != some_container.end();
         ++it) {
        do_something(it, idx++);
     }

答案 2 :(得分:1)

如果我理解正确,你想要的是当你到达容器的最后一个元素时,你只需再次跳到容器的开头。我们可以很容易地编码:

auto first = std::begin(c);
const auto last = std::end(c);
std::size_t idx = 0;

while (!should_exit()) {
    do_something(idx);

    ++idx;
    if (++first == last) { // reset
        idx = 0;
        first = std::begin(c);
    }
}

这适用于任何STL样式的容器。同时拥有迭代器和索引可能是不必要的,但这是一个KISS解决方案,适用于非随机访问容器,如std::list以及vector / array。