C++ 如何从向量引用中删除元素?
我正在遍历一个以向量为V参数的映射C++ 如何从向量引用中删除元素?,c++,vector,C++,Vector,我正在遍历一个以向量为V参数的映射 map<SomeKey, vector<shared_ptr<SomeObject>> 我已经设法让它在不使用引用向量和使用本地副本的情况下工作,但它不会从实际地图向量中删除,只有当前范围内的复制向量 有人能举例说明我如何做到这一点吗 这不是另一篇文章的副本,因为我没有在我想从中删除元素的向量上循环。我在一张包含向量的地图上循环 矢量包含在地图中,我希望创建一个指向地图中矢量的参考矢量,并直接从地图的矢量中删除元素 map&l
map<SomeKey, vector<shared_ptr<SomeObject>>
我已经设法让它在不使用引用向量和使用本地副本的情况下工作,但它不会从实际地图向量中删除,只有当前范围内的复制向量
有人能举例说明我如何做到这一点吗
这不是另一篇文章的副本,因为我没有在我想从中删除元素的向量上循环。我在一张包含向量的地图上循环 矢量包含在地图中,我希望创建一个指向地图中矢量的参考矢量,并直接从地图的矢量中删除元素
map<SomeKey, vector<shared_ptr<SomeObject>> myMap;
//loop over map
for (auto it = myMap.begin(); it != myMap.end();) {
shared_ptr<K> keyObject = it->first;
vector<shared_ptr<V>> * referenceList = &myMap[keyObject];
referenceList.erase(myMap.begin() + 1);
//this would remove it from myMap[keyObject]
}
为此,要避免复制循环中创建的变量,可以使用以下方法:
for(auto m: mymap){
auto & b = mymap[m.first]; //direct access to map
for(auto i=b.begin(); i<b.end(); i++){
If( (*i) == someobject )
b.erase(i);
}
}
与
auto
不会咬人,相信我me@TheDude似乎不是引用的向量,也不能解决我的问题。@jjmcc认为该向量是引用是无关的。@fureish什么?这是一个替换very::long::name::thing foo=…;的建议代码>与自动foo=代码>。感谢您的回复。我刚刚尝试过这个,但在erase
函数中仍然得到一个abort()。我已经用新代码更新了我的OP。实际上,谢谢,这很有效。abort()是由其他原因引起的。@jjmcc此答案中的代码已被破坏,请参阅。@HolyBlackCat这是重复的。但是,我的向量不应该有任何重复项,所以在我的情况下它似乎可以工作。@jjmcc如果确实没有重复项就可以了,但是你最好break代码>清除某些内容后退出循环。
auto & clientList = connections[iterator->first];
for (auto i = clientList.begin(); i != clientList.end(); i++) {
if ((*i) == client) {
clientList.erase(i);//abort() thrown here
break;
}
}
for(auto m: mymap){
auto & b = mymap[m.first]; //direct access to map
for(auto i=b.begin(); i<b.end(); i++){
If( (*i) == someobject )
b.erase(i);
}
}
If( (*i) == someobject )
while( ((*i) == some object) && (i != b.end()) )