gpt4 book ai didi

c++ - 从 map 中删除时出现奇怪的段错误

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:22:36 25 4
gpt4 key购买 nike

我有以下代码:

//update it in the map
std::map<std::string, std::string>::iterator it;
for(it = spreadsheets.at(i).cells.begin(); it != spreadsheets.at(i).cells.end(); ++it)
{
if(it->first == change.first)
{
if(change.second == "")
{
spreadsheets.at(i).cells.erase(change.first);
}
else
{
it->second = change.second;
}
}
}

上面的代码在我的 mac 上完美运行,但是当我在 linux 计算机上运行时,它会在 spreadsheets.at(i) 上引发段错误。 cells.erase(change.first);

知道是什么导致了这个错误吗?我试过将 erase(change.first) 更改为 erase(it) 但我仍然遇到段错误。

最佳答案

因为当您从容器中删除时,您的迭代器不再有效,但您的循环仍在继续。

您可以将循环更改为:

std::map<std::string, std::string>::iterator it = spreadsheets.at(i).cells.begin();
while (it != spreadsheets.at(i).cells.end())
{
if(it->first == change.first)
{
if(change.second == "")
{
spreadsheets.at(i).cells.erase(it++); //Post increment returns a copy pointing at the current element, while it already points to the next element and thus stays valid after erase
}
else
{
it->second = change.second;
++it;
}
}
else
++it;
}

既然我想到了,为什么要用迭代器指向的对中的第一个元素进行删除,即:

spreadsheets.at(i).cells.erase(change.first);

代替

spreadsheets.at(i).cells.erase(it);

效率较低,因为必须进行另一次查找。

关于c++ - 从 map 中删除时出现奇怪的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16178898/

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