我正在使用{
"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
或其他容器,那就太棒了。
答案 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。