首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >进阶循环迭代器

进阶循环迭代器
EN

Stack Overflow用户
提问于 2016-07-23 17:22:19
回答 1查看 681关注 0票数 2

这有什么好的理由吗?

代码语言:javascript
运行
复制
vector<CalcToken*>* myVec; //assume this contains CalcToken
for(vector<CalcToken *>::iterator it = myVec->begin() ; it != myVec->end() ; advance(it,1)) {
        cout<< (*it)->toString()<< " ";
    }

这不会给我带来任何东西,back?(advance(it,2))

代码语言:javascript
运行
复制
for(vector<CalcToken *>::iterator it = myVec->begin() ; it != myVec->end() ; advance(it,2)) {
    cout<< (*it)->toString()<< " ";
}

我想做一个循环,应该跳过一些元素.,下面的循环不适合我,无论是it++、it++还是it+=2。

EN

回答 1

Stack Overflow用户

发布于 2016-07-23 18:11:39

如果向量有奇数的元素,advance调用将尝试将迭代器推进到向量的末尾。这是不明确的行为。

解决这个问题的一种方法是使用对标准advance的以下修改(我限制前进方向以节省自己的工作)

代码语言:javascript
运行
复制
template<typename Iterator>
 void limited_advance(Iterator& it, Iterator end, unsigned distance,
                      std::random_access_iterator_tag)
{
  if ((end - it) < distance)
    it += distance;
  else
    it = end;
}

template<typename Iterator>
 void limited_advance(Iterator& it, Iterator end, unsigned distance,
                      ...)
{
  while (it != end && distance > 0)
  {
    ++it;
    --distance;
  }
}

template<typename Iterator>
 void limited_advance(Iterator& it, Iterator end, unsigned distance)
{
  limited_advance(it, end, distance,
                  typename std::iterator_traits<Iterator>::iterator_category());
}

然后将advance(it,2)替换为limited_advance(it, myVec->end(), 2)

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

https://stackoverflow.com/questions/38544551

复制
相关文章

相似问题

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