C++ 在映射上迭代并调用删除其他元素的函数就是映射
我有一个在全局内存中定义的映射。 我正在迭代它,假设我在第三个元素中。现在我调用另一个函数,它在同一个映射上生成自己的迭代器,但是它可能会删除第4个或第5个。。。地图中的元素。 我的问题是,当我从该函数返回并继续遍历映射时(我提醒您我在第3个元素中),我的迭代器是无效的还是安全的 很抱歉,我无法附加代码,因为它非常长 谢谢 编辑: 我的问题是这样的:C++ 在映射上迭代并调用删除其他元素的函数就是映射,c++,stl,C++,Stl,我有一个在全局内存中定义的映射。 我正在迭代它,假设我在第三个元素中。现在我调用另一个函数,它在同一个映射上生成自己的迭代器,但是它可能会删除第4个或第5个。。。地图中的元素。 我的问题是,当我从该函数返回并继续遍历映射时(我提醒您我在第3个元素中),我的迭代器是无效的还是安全的 很抱歉,我无法附加代码,因为它非常长 谢谢 编辑: 我的问题是这样的: map<string,string> mapi; void er() { mapi.erase("t"); } int
map<string,string> mapi;
void er() {
mapi.erase("t");
}
int main() {
mapi.insert(pair<string,string>("w","a"));
mapi.insert(pair<string,string>("e","a"));
mapi.insert(pair<string,string>("r","a"));
mapi.insert(pair<string,string>("t","a"));
mapi.insert(pair<string,string>("A","a"));
mapi.insert(pair<string,string>("u","a"));
mapi.insert(pair<string,string>("C","a"));
map<string,string>::iterator it;
for (it=mapi.begin(); it!=mapi.end(); it++) {
cout << it->first << endl;
if (it->first=="t")
er();
}
map-mapi;
void er(){
mapi.erase(“t”);
}
int main(){
mapi.insert(成对(“w”、“a”);
mapi.insert(成对(“e”、“a”);
mapi.insert(成对(“r”、“a”);
mapi.insert(成对(“t”、“a”);
mapi.insert(成对(“A”、“A”);
mapi.insert(成对(“u”、“a”);
mapi.insert(成对(“C”、“a”);
对它进行迭代器;
for(it=mapi.begin();it!=mapi.end();it++){
cout first==“t”)
er();
}
}
在这种情况下,我删除了相同的元素-valgrind说这是一个错误。但是,当我删除其他元素时,它似乎工作正常。来自:
同时从映射中删除元素
不会使任何迭代器无效,
当然,除了迭代器
实际上,指向
正在擦除
创建一个简单的用例并对其进行测试。@Xeo:这不能保证它的安全性和可定义性。我创建了一些非常简单的东西。似乎工作,但我只是想别人的意见只是sure@Oli:但它至少会给出一些成功或失败的迹象,可以用来完善这个问题。:)@罗布:那就说你这么做了,也许还包括代码。:)如果确实删除了当前元素,返回值将为您提供一个新的有效迭代器以继续(而不是增加无效迭代器,这将产生未定义的行为)。有时可以重新安排循环以利用此功能。映射中的erase()无效。没有迭代器是可用的returned@rob你是对的;我在考虑序列要求。对于map
m.erase(i++)
可以做到这一点(post increment为数不多的好用法之一)。