gpt4 book ai didi

c++ - 遍历 map 并删除元素

转载 作者:行者123 更新时间:2023-11-28 01:51:37 34 4
gpt4 key购买 nike

我有一个全局变量作为 map 和一个迭代此 map 元素的函数,例如:

void printMap(){
for ( auto it = MyMap.begin(); it != MyMap.end(); ++it ){
std::cout << it->second;
}
}

效果很好。

我想在打印一个元素后的函数中添加一个功能,它应该像这样从 map 中删除:

void printMap(){
for ( auto it = MyMap.begin(); it != MyMap.end(); ++it ){
std::cout << it->second;
MyMap.erase(it);
}
}

但是,通过添加删除行,我得到了这种类型的异常错误:

Thread 2: EXC_BAD_ACCESS (code=1, address=0x20000002)

我尝试了另一种方式是这样的:

void myFunction(){
printMap();
MyMap.clear();
}

但是我也遇到了同样的异常

Thread 2: EXC_BAD_ACCESS (code=1, address=0x0)

据我了解,当我们引用不存在的内存位置时会发生这种异常。但是我知道它在那里,因为迭代器得到了它的值并且它被打印出来了。即便如此,我还是使用了第二种方法,以防万一我不引用不存在的内存位置,但我仍然遇到异常。

那么我如何遍历元素打印结果然后删除它呢?

更新1
按照下面的建议和链接的主题,我将我的功能更改为:

void printMap(){
bool i = true;
for (auto it = MyMap.cbegin(), next_it = MyMap.cbegin(); it != MyMap.cend(); it = next_it)
{
cout << it->second;
next_it = it; ++next_it;
if (i) {
MyMap.erase(it);
}

}
}

我也试过这个https://stackoverflow.com/a/42820005/7631183还有这个https://stackoverflow.com/a/42819986/7631183

问题仍然没有解决,我得到了同样的错误




更新2
我在另一台机器上运行完全相同的代码并且运行良好。我仍然不知道是什么原因,所以我猜按照评论中的建议,第一个 std::map 有一些问题。

附言第一台机器是mac,第二台是linux

最佳答案

当你从 map 中删除一个元素时,你已经使你在循环中使用的迭代器无效,从而导致错误。由于这个原因,erase 方法返回一个迭代器。

for( auto it = MyMap.begin(); it != MyMap.end(); )
{
std::cout << it->second;
it = MyMap.erase(it);
}

这确实是一个重复的问题。您只是不太了解它,以至于看不出它是重复的。我希望使迭代器无效的解释有助于澄清这一点。

关于c++ - 遍历 map 并删除元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42819461/

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