Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在映射上迭代并调用删除其他元素的函数就是映射_C++_Stl - Fatal编程技术网

C++ 在映射上迭代并调用删除其他元素的函数就是映射

C++ 在映射上迭代并调用删除其他元素的函数就是映射,c++,stl,C++,Stl,我有一个在全局内存中定义的映射。 我正在迭代它,假设我在第三个元素中。现在我调用另一个函数,它在同一个映射上生成自己的迭代器,但是它可能会删除第4个或第5个。。。地图中的元素。 我的问题是,当我从该函数返回并继续遍历映射时(我提醒您我在第3个元素中),我的迭代器是无效的还是安全的 很抱歉,我无法附加代码,因为它非常长 谢谢 编辑: 我的问题是这样的: map<string,string> mapi; void er() { mapi.erase("t"); } int

我有一个在全局内存中定义的映射。 我正在迭代它,假设我在第三个元素中。现在我调用另一个函数,它在同一个映射上生成自己的迭代器,但是它可能会删除第4个或第5个。。。地图中的元素。 我的问题是,当我从该函数返回并继续遍历映射时(我提醒您我在第3个元素中),我的迭代器是无效的还是安全的

很抱歉,我无法附加代码,因为它非常长

谢谢

编辑: 我的问题是这样的:

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为数不多的好用法之一)。