带 while 循环的 C++11 反向迭代器

标签 c++ list c++11 iterator reverse-iterator

我知道代码不是好的做法,所以问题不在于此。我只想了解以下示例的工作原理。请注意,当我调用 remove 时,我没有对迭代器做任何事情,所以当循环进入下一次迭代时,它如何指向下一个元素?

#include <string>
#include <list>
#include <algorithm>
#include <iostream>

class Obj;
std::list<Obj> objs;

class Obj
{
public:
  Obj(const std::string& name, int age)
  : name_(name), age_(age)
  {}

  std::string name()
  {
    return name_;
  }

  int age()
  {
    return age_;
  }
private:
  std::string name_;
  int age_;
};


void remove(const std::string& name)
{
  auto it = find_if(objs.begin(), objs.end(),[name] (Obj& o) { return (o.name() == name); });
  if (it != objs.end())
  {
    std::cout << "removing " << it->name() << std::endl;
    objs.erase(it);
  }
}

int main()
{
  objs.emplace_back("bob", 31);
  objs.emplace_back("alice", 30);
  objs.emplace_back("kevin", 25);
  objs.emplace_back("tom", 45);
  objs.emplace_back("bart", 37);
  objs.emplace_back("koen", 48);
  objs.emplace_back("jef", 23);
  objs.emplace_back("sara", 22);

  auto it = objs.rbegin();
  while (it != objs.rend())
  {

   std::cout << it->name() << std::endl;

   if (it->name() == "tom")
   {
      remove(it->name()); //notice I don't do anything to change the iterator
   }
   else
   {
     ++it;
   }
  }
  return 0;
}

输出如下:

sara
jef
koen
bart
tom
removing tom
kevin
alice
bob

最佳答案

通过删除它寻址的对象来使迭代器无效(无论您是否使用它的值用于该目的)。如果您在那之后尝试访问它,则行为是未定义的(阅读:任何事情都可能发生,例如相同的 it 跳转到下一个元素,或者您的程序崩溃)。您不能将此依赖于任何其他行为。

关于带 while 循环的 C++11 反向迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52219403/

相关文章:

c++ - Valgrind报告QThread::start()上的内存泄漏

c++ - boost::bind 与模板仿函数

c++ - Linux 上的命令提示符教程

c++ - 是否可以在 bool 中发送十进制值(8 位)?如果是那么如何?

c++ - 为什么在使用 std::remove() 从 vector 中删除多个值时会发生跳过?

c++ - 条件变量和#pragma pack bug

c++ - 主函数体未检测到对重载可变参数模板函数 C++ 的调用

android - 如何像在 gmail 中一样使用滑动手势从列表中删除项目

python - 根据字符串中的数字对字符串列表进行排序

python - ValueError : list. remove(x) : x not in list, 但我没有看到错误