【问题标题】:advance iterator in loop循环中的高级迭代器
【发布时间】:2016-07-23 17:22:19
【问题描述】:

有什么理由让它运作良好

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

这并没有让我得到任何回报?(advance(it,2))

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

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

【问题讨论】:

  • 你试过**it++吗?还有“以下内容不适合我”为什么它不工作??
  • 它是打印出一些元素然后垃圾还是根本不起作用?
  • @bhuvan-venkatesh 第一个可以很好地打印元素,第二个根本不打印。即使我在那之后在循环之外打印一些东西,它也不会被打印出来。 FirstStep,我不知道,当我使用它们时它不会打印任何东西。
  • 可能它仍然在缓冲区中(cout 被缓冲)并且在未定义的行为发生之前缓冲区没有被刷新。

标签: c++ vector iterator stdadvance


【解决方案1】:

如果向量有奇数个元素,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-&gt;end(), 2)

【讨论】:

  • 好的,这比我的回答好。我试图修复范围检查,但后来意识到这会导致在数组开始之前形成迭代器并进行某种签出。
猜你喜欢
  • 1970-01-01
  • 2016-01-02
  • 1970-01-01
  • 1970-01-01
  • 2011-10-24
  • 2012-07-20
  • 2023-03-15
  • 2015-11-02
  • 2019-04-23
相关资源
最近更新 更多