【问题标题】:In C++ is it valid to pop_front() on a std::deque in a loop?在 C++ 中,循环中 std::deque 上的 pop_front() 是否有效?
【发布时间】:2021-09-30 06:11:48
【问题描述】:

如果我有这个代码:

#include <deque>

int main()
{
    std::deque<int> d;

    d.push_back(1);
    d.push_back(2);
    d.push_back(3);
    d.push_back(4);
    d.push_back(5);

    for (std::deque<int>::iterator it = d.begin(); it != d.end(); it++)
    {
        d.pop_front();
    }

    return 0;
}

我想知道这是否有效,因为根据我的阅读,pop_front() 会使任何迭代器或对被删除元素的引用无效。因此,如果“it”设置为 d.begin(),那么我们调用 d.pop_front(),然后我们执行“it++”,因为对 pop_front() 的调用删除了“it”所指的元素,不会不是说再增加它是无效的吗?

【问题讨论】:

  • 可以在 pop_front(); 之前增加循环中的迭代器;所以你不要持有无效的。
  • 但问题应该是“你想达到什么目标。”
  • 如果你想清空deque,你可以使用std::dequeue::clear方法。
  • 目的是遍历双端队列并在每个匹配特定条件的元素上调用 pop_front()。

标签: c++ stl deque


【解决方案1】:

这是无效的,因为一旦pop_front() 被执行,it 就不再指向一个有效的迭代器,因此it++ 将产生未定义的行为。

【讨论】:

  • 也可以推荐while(!d.empty())
猜你喜欢
  • 1970-01-01
  • 2019-04-23
  • 2011-09-11
  • 2021-12-23
  • 2011-11-14
  • 2017-10-17
  • 1970-01-01
  • 2014-07-03
  • 2011-07-05
相关资源
最近更新 更多