c++ - 如何使用 for 循环通过反向迭代器调用删除

标签 c++ c++11

关于此处提供的答案:How to call erase with a reverse iterator

在带有 -std=c++11 的 g++ 4.8.4 中编译时,以下结果会导致段错误(在 ++it 上)。我是不是误解了答案?

  std::map<int,int> testmap;
  testmap[0] = 1;
  for(auto it=testmap.rbegin(); it!=testmap.rend(); ++it) {
    testmap.erase( std::next(it).base() );
  }

最佳答案

erase 使迭代器无效,你必须从 erase 的返回中重建它:

it = std::map<int,int>::reverse_iterator(testmap.erase( std::next(it).base() ));

或(c++11)

it = decltype(it){testmap.erase( std::next(it).base() )};

Demo .

为了完整性,这是原始问题中更正后的循环的样子(注意迭代器增量已从 for(...) 中删除:

for (auto rit = testmap.rbegin(); rit != testmap.rend(); /* empty */) {
    if (WE_WANT_TO_ERASE(rit)) {
        rit = decltype(rit){ testmap.erase(std::next(rit).base()) };
    } else {
        ++rit;
    }
}

关于c++ - 如何使用 for 循环通过反向迭代器调用删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37005449/

相关文章:

c++11 - std::move 与 lambda 中的 std::shared_ptr

c++ - 替代函数语法差异

c++ - 抽象函数和可变参数列表

c++ - [[noreturn]] 函数指针

c++ - 装饰器模式 - 我如何在初始化时不调用复制构造函数?

c++ - 如何在字符串中搜索字符,并删除该字符

c++ - 无法使用复印功能

c++ - 与C++中的delete关键字操作混淆

c++ - Cc 套接字编程 select() 的第一个参数

c++ - 在 C++ 中将通用构造函数分配给成员变量时的 std::move 或 std::forward