2

有什么理由可以很好地工作吗

vector<CalcToken*>* myVec; //assume this contains CalcToken
for(vector<CalcToken *>::iterator it = myVec->begin() ; it != myVec->end() ; advance(it,1)) {
        cout<< (*it)->toString()<< " ";
    }

这并没有让我得到任何回报?(提前(它,2))

for(vector<CalcToken *>::iterator it = myVec->begin() ; it != myVec->end() ; advance(it,2)) {
    cout<< (*it)->toString()<< " ";
}

我想制作一个应该跳过某些元素的循环......,以下内容对我不起作用 it++,it++ 和 it+=2。

4

1 回答 1

2

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

解决它的一种方法是使用标准的以下修改advance(我限制向前方向以节省自己的工作)[未经测试的代码]:

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).

于 2016-07-23T18:11:39.953 回答