如何从矢量引用中删除元素?

时间:2018-02-04 16:53:59

标签: c++ vector

我正在迭代一个将矢量作为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;
        }
    }

1 个答案:

答案 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()) )