迭代器查询 C++

问题描述

所以我正在研究一个使用迭代器的简单示例。这是一对整数的列表,最初包含 2 个元素。 {1,1} -> {2,2} 现在我运行下面的代码,所以最初它指向 {2,2} 所以我的理解是指向 {2,2} 的迭代器现在被复制到其中并且它会保持不变但是当我执行 values.pop_back( ) 在下一行它自动指向 {1,1} Now 。这怎么可能

谁能帮我理解这种行为?

list<pair<int,int>>::reverse_iterator it = values.rbegin();
      values.pop_back();
      auto pos = locator.find( it->first);
      if( pos != locator.end())
      {
          locator.erase( pos);

      }

解决方法

反向迭代器在这种情况下很奇怪。反向迭代器包装了一个“真正的”迭代器,可作为 it.base() 访问。这个“真正的”迭代器是一个元素,指向跟随反向迭代器似乎引用的元素。也就是说,&*it == &*std::prev(it.base())。这是必要的,因为在容器中,有一个有效的 one-past-the-last 迭代器,但没有一个有效的 one-before-first 迭代器用于 rend() 来包装。

在您的示例中,在 it = values.rbegin(); 之后,您有 it.base() == values.end()。访问 it 实际上是访问 std::prev(values.end()),或者换句话说,values.back() - 当前碰巧最后的任何元素。

std::list 中,pop_back() 使被移除元素的迭代器无效,而不是其他任何迭代器 - 特别是,values.end() 仍然有效,因此 it 仍然有效并且仍然引用 values.back() - 删除后的最后一个元素。