如何逐个擦除STL双端的所有元素?

aak*_*ash 0 c++ iterator stl

我正面临一个奇怪的问题,即在迭代它时擦除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;
}
Run Code Online (Sandbox Code Playgroud)

我对后增量方法不起作用的原因一无所知.请注意,最终目标不是使用此方法来擦除所有元素.但是,我想了解我提到的两种方法的区别.

Dre*_*ann 5

迭代器失效规则对于不同的容器是不同的.

用于std::deque::erase:

所有迭代器和引用都是无效的,除非擦除的成员位于双端队列的末尾(前面或后面)(在这种情况下,只有迭代器和对擦除成员的引用无效)[23.2.1.3/4]

你是从得到段错误testQueue.erase(it++),因为所产生的迭代器it++已经已经失效.