我面临一个与在迭代 STL 列表时擦除元素有关的奇怪问题。我知道擦除元素会使迭代器无效的事实。所以,要么
"testQueue.erase(it++);"
或者"it = testQueue.erase(it);"
应该使用。
为了简化我的问题,我尝试在迭代列表时删除所有元素。但是,当使用前一种机制时,我遇到了 Segfault。
下面是完整的代码供您参考。
#include <iostream>
#include <queue>
#include <string>
int main()
{
std::string d1 = "d1";
std::string d2 = "d2";
std::string d3 = "d3";
std::deque<std::string> testQueue;
testQueue.push_back(d1);
testQueue.push_back(d2);
testQueue.push_back(d3);
std::deque<std::string>::iterator it = testQueue.begin();
for(; it!=testQueue.end(); ++it){
std::cout << (*it) << std::endl;
}
std::cout << "========" << std::endl;
it = testQueue.begin();
while(it!=testQueue.end()){
testQueue.erase(it++); // This causes Segfault
//it = testQueue.erase(it); // This one works just fine.
}
std::cout << "========" << std::endl;
std::cout << "========" << std::endl;
std::cout << "========" << std::endl;
std::cout << "========" << std::endl;
std::cout << "========" << std::endl;
it = testQueue.begin();
for(; it!=testQueue.end(); ++it){
std::cout << (*it) << std::endl;
}
return 0;
}
我对为什么后增量方法不起作用一无所知。请注意,最终目标不是使用这种方法来擦除所有元素。但是,我想了解我提到的两种方法有什么区别。