gpt4 book ai didi

c++ - 如何一一删除STL deque的所有元素?

转载 作者:太空宇宙 更新时间:2023-11-04 15:05:32 33 4
gpt4 key购买 nike

我遇到了一个与在迭代 STL 列表时删除元素相关的奇怪问题。我知道删除元素会使迭代器无效这一事实。所以,要么

"testQueue.erase(it++);""it = testQueue.erase(it);"

应该使用。

为了简化我的问题,我尝试在迭代列表时删除所有元素。但是,当使用前一种机制时,我遇到了段错误。

下面是完整的代码供您引用。

#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;
}

我不知道为什么后增量方法不起作用。请注意,最终目标不是使用这种方法来删除所有元素。但是,我想了解我提到的两种方法有什么区别。

最佳答案

不同容器的迭代器失效规则不同。

对于std::deque::erase:

all iterators and references are invalidated, unless the erased members are at an end (front or back) of the deque (in which case only iterators and references to the erased members are invalidated) [23.2.1.3/4]

您正在从 testQueue.erase(it++) 中获取段错误,因为 it++ 生成的迭代器已失效。

关于c++ - 如何一一删除STL deque的所有元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16094713/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com