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

在g++ 4.8.4中使用-std = c++ 11编译时,以下结果会导致段错误(在++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使迭代器无效,您必须从擦除的返回中重建它:

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(it)) {
        rit = decltype(rit){ testmap.erase(std::next(rit).base()) };
    } else {
        ++rit;
    }
}

09-12 21:49