gpt4 book ai didi

c++ - 这个 map 删除安全吗?

转载 作者:行者123 更新时间:2023-11-28 06:03:45 25 4
gpt4 key购买 nike

<分区>

我有一个带有这样 map 的 for 循环。

std::map<int,std::string> mymap = {{1,"a"},{2,"b"},{3,"c"}};

for(std::map<int,std::string>::iterator it = mymap.begin(); it!=mymap.end(); ++it)
{
if(it->first==3)
{
mymap.erase(it);
}
}

std::cout << mymap.rbegin()->second << std::endl;

输出是预期的“b”。问题是:这会以某种方式导致无限循环(或崩溃)吗?我是说之后

erase(it)

迭代器无效。如果删除的项目不是最后一个,那应该没问题,因为“它”在删除后递增,并且在评估条件时它指向 mymap.end() 最大值。但是,如果我删除最后一个,则删除后 mymap.end() 应该在最后一个剩余项目之后,然后无论如何都会递增。它不能以某种方式超出范围吗?我不应该使用类似的东西吗

for(std::map<int,std::string>::iterator it = mymap.begin(); it!=mymap.end(); ++it)
{
std::map<int,std::string>::const_iterator tempit = it;
const bool lastItemErased = ++tempit == mymap.end();

if(it->first==3)
{
mymap.erase(it);
}

if(lastItemErased) break;
}

安全吗?

注意:如果我尝试使用键 3 和键 2 删除元素,则以上两个都按预期运行和运行。我不明白这怎么可能,为什么它没有崩溃。如何递增无效的迭代器?

更新:它必须与 c++03 一起工作。我这样初始化 map ,以便更轻松地发布问题。

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