我试图从第n个元素开始迭代一个向量。不知道我该怎么做。
我有一个向量A和B。我的向量A有10个PC1-PC10元素,我的向量B有20个用户1-User 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的迭代器吗?还是还有别的选择?
编辑
我似乎问错了问题。我已记下这个问题的答案,并会在短期内发表另一篇文章。谢谢你对我问题的快速回答!
发布于 2015-02-10 15:29:24
嵌套循环中的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多。如果在进入循环之前检查这个假设,这可能是可以的。如果这个假设被打破,代码就会有未定义的行为。
发布于 2015-02-10 15:48:30
其他人已经回答了如何重置或推进迭代器,所以我将回答,如何以更简单的方式解决您的问题。使用索引并行迭代两个向量比使用两个迭代器要简单得多:
// assumes vecB is bigger than vecA as described in the question
for (std::size_t i = 0; i < vecB.size(); i++) {
auto user = vecB[i];
auto pc = vecA[i % vecA.size()];
}注意如何使用余数运算符迭代较小的向量。
发布于 2015-02-10 15:29:18
您不需要更改B的迭代器,它将自动继续使用第11个元素。但是,您需要在for循环的开头重新启动A上的迭代(或者使用a.end(),它不是一个有效的元素):
if (a == vecA.end()) {
a = vecA.begin();
}此外,还应该对这两种情况进行迭代,但只在b上检查end;如果您检查a,则在if变为真之前,for将结束:
for (auto a = vecA.begin(), b = vecB.begin(); b != vecB.end(); ++a, ++b)您可以看到整个代码这里。
https://stackoverflow.com/questions/28435405
复制相似问题