我正在迭代一个将矢量作为V参数的地图
map<SomeKey, vector<shared_ptr<SomeObject>>
我正在迭代以删除此地图中向量中包含的SomeObject
的所有实例。我目前尝试了一些方法,但每个方法都给我一些超出范围的错误,或者abort()。
for (auto iterator = myMap.begin(); iterator != myMap.end(); ) {
shared_ptr<SomeKey> keyObject = iterator->first;
//reference the actual vector stored in the map, not a copy
vector<shared_ptr<SomeObject>> * someObjectList = &myMap[keyObject];
int index = findIndex(someObject, *someObjectList);
if (index != -1) {
auto itr = (*someObjectList).begin() + index;
&someObjectList->erase(itr);
}
//at this point, I do not want the SomeObject to exist in the vectors in the map,
//which is why I am trying to used a vector reference so it doesn't create a copy
vector<shared_ptr<SomeObject>> list = myMap[keyObject];
++iterator;
}
我已经设法让它工作而不使用引用的向量,并使用本地副本,但它不会从实际的地图向量中删除,只有当前范围中复制的向量。
有人可以提供一个如何做到这一点的例子吗?
这不是另一篇文章的重复,因为我没有循环遍历我要删除元素的向量。我正在循环一个包含矢量的地图。
矢量包含在地图中,我希望创建一个指向地图中的矢量的参考矢量,并直接从地图的矢量中删除元素。
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]
}
auto & clientList = connections[iterator->first];
for (auto i = clientList.begin(); i != clientList.end(); i++) {
if ((*i) == client) {
clientList.erase(i);//abort() thrown here
break;
}
}
答案 0 :(得分:0)
为此,您希望避免在循环中创建的复制变量,您可以使用类似:
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()) )