我正在尝试从第n个元素开始迭代向量。不知道我该怎么做。
我有一个矢量阿和乙。我的向量A具有PC1-PC10的10个元素,我的向量B具有User1-User20的20个元素。
所以我想做的是,当我的向量A和向量B都到达第10个元素时,也就是说向量A的最后一个元素,我想重复迭代向量A,但是从第11个元素开始迭代向量B,这样我就可以用它做一些事情。
以下是我想出的简化代码,但从技术上讲,它是关于同一件事的:
vector<string>::iterator b = vecB.begin();
for (int i = 1; i < 2; i++) {
for (vector<string>::iterator a = vecA.begin(); a != vecA.end() ; a++) {
if (a == vecA.end()) {
b = vecB.begin() + 10; //here the iterator for verB should start from the 11th element
}
++b
}
}
我应该弄乱向量B的迭代器吗?还是有另一种选择?
编辑
看来,我毕竟一直在问一个错误的问题。我已标记了该问题的答案,并将在不久后发布另一个问题。感谢您对我的问题的快速回复!
该if
嵌套循环内的条件将永远是真实的,因为它与循环条件冲突:
for (vector<string>::iterator a = vecA.begin(); a != vecA.end() ; a++) {
// This check ----------------------------------^^^^^^^^^^^^^^^
// guarantees that this will never succeed:
// vvvvvvvvvvvvvvv
if (a == vecA.end()) {
...
}
}
您应该这样重写代码:
vector<string>::iterator b = vecB.begin();
// Check that vecB has sufficient number of elements before entering the loop.
for (int i = 1 ; i < 2 ; i++) {
for (vector<string>::iterator a = vecA.begin(); a != vecA.end() ; ++a, ++b) {
...
}
// At this point we know for sure that a == vecA.end(),
// because it is a post-condition of the for loop above.
b = std::next(vecB.begin(), 11);
}
的调用++b
可以移动到循环头中。
注意:的使用,std::next
尽管
b = vecB.begin() + 10;
编译向量时,并不能保证适用于所有类型的容器。使用std::next
来代替:
b = std::next(vecB.begin(), 11);
注意:此代码假设一个vecB
元素至少比元素多11个vecA
。如果您在进入循环之前检查了该假设,则可能会好的。如果这个假设不成立,则代码将具有未定义的行为。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句