首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从第n元素开始迭代向量

从第n元素开始迭代向量
EN

Stack Overflow用户
提问于 2015-02-10 15:26:10
回答 5查看 2.8K关注 0票数 3

我试图从第n个元素开始迭代一个向量。不知道我该怎么做。

我有一个向量A和B。我的向量A有10个PC1-PC10元素,我的向量B有20个用户1-User 20元素。

所以我想做的是,当我的向量A和B都到达第10个元素时,意思是向量A的最后一个元素,我想重复迭代向量A,但是从第11个元素开始迭代向量B,这样我就可以用它做一些事情。

下面是我想出的简化代码,但从技术上讲也是一样的:

代码语言:javascript
复制
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的迭代器吗?还是还有别的选择?

编辑

我似乎问错了问题。我已记下这个问题的答案,并会在短期内发表另一篇文章。谢谢你对我问题的快速回答!

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2015-02-10 15:29:24

嵌套循环中的if条件永远不会为真,因为它与循环条件相冲突:

代码语言:javascript
复制
for (vector<string>::iterator a = vecA.begin(); a != vecA.end() ; a++) {
// This check ----------------------------------^^^^^^^^^^^^^^^
// guarantees that this will never succeed:
//      vvvvvvvvvvvvvvv
    if (a == vecA.end()) {
        ...
    }
}

您应该像这样重写代码:

代码语言:javascript
复制
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的使用:尽管

代码语言:javascript
复制
b = vecB.begin() + 10;

为向量编译,它不能保证所有类型的容器。使用std::next代替:

代码语言:javascript
复制
b = std::next(vecB.begin(), 11);

注释:--这段代码假设vecB至少有11个元素比vecA多。如果在进入循环之前检查这个假设,这可能是可以的。如果这个假设被打破,代码就会有未定义的行为。

票数 3
EN

Stack Overflow用户

发布于 2015-02-10 15:48:30

其他人已经回答了如何重置或推进迭代器,所以我将回答,如何以更简单的方式解决您的问题。使用索引并行迭代两个向量比使用两个迭代器要简单得多:

代码语言:javascript
复制
// 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()];
}

注意如何使用余数运算符迭代较小的向量。

票数 1
EN

Stack Overflow用户

发布于 2015-02-10 15:29:18

您不需要更改B的迭代器,它将自动继续使用第11个元素。但是,您需要在for循环的开头重新启动A上的迭代(或者使用a.end(),它不是一个有效的元素):

代码语言:javascript
复制
if (a == vecA.end()) {
    a = vecA.begin();
}

此外,还应该对这两种情况进行迭代,但只在b上检查end;如果您检查a,则在if变为真之前,for将结束:

代码语言:javascript
复制
for (auto a = vecA.begin(), b = vecB.begin(); b != vecB.end(); ++a, ++b)

您可以看到整个代码这里

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28435405

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档