Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
446 views
in Technique[技术] by (71.8m points)

c++ - How to call erase with a reverse iterator using a for loop

Regarding the answer provided here: How to call erase with a reverse iterator

The following results in a segmentation fault (upon ++it) when compiled in g++ 4.8.4 with -std=c++11. Am I misunderstanding the answer?

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

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

erase invalidates iterator, you have to reconstruct it from return of erase:

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

or (c++11)

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

Demo.

For completeness, here is what the corrected loop from the original question looks like (notice that the iterator increment has been removed from the 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;
    }
}

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

2.1m questions

2.1m answers

60 comments

56.9k users

...