首页 > 解决方案 > 当擦除和 push_back 发生时如何正确擦除 reverse_iterator?

问题描述

我有一个列表容器,它看起来像:

std::list<int> l = {1,2,3,4,5,6,7,8};

我经常擦除元素,所以我选择std::list.

但是,我也想在 O(1) 中找到元素,所以我记录了 reverse_iterator。

例如:

  l.push_back(9);
  auto s = l.rbegin();  // record the iterator of 9, in order to erase it in the future fastly.
  cout << *s << endl;
  l.push_back(10);
  auto s2 = l.rbegin();

但是当我像这样擦除时:

l.erase(std::next(s).base());  // s the iterator of 9, in my brain

我想擦除 9,但实际上,它擦除了 10。

我有两个问题:

为什么我应该使用next?实际上我*s可以得到元素,这与.end().

我怎样才能在我以前保存的迭代器中进行擦除?

标签: c++stl

解决方案


由于 的迭代器list是一个双向迭代器,而不是使用reverse_iterator,您可以只使用--l.end()来获取最后一个值的迭代器。

std::list<int> l = {1,2,3,4,5,6,7,8};
l.push_back(9);
auto s = --l.end(); // record the iterator of 9
l.push_back(10);
l.erase(s); // erase the iterator of 9

演示。


推荐阅读