从键的向量中删除一个值

时间:2013-09-25 12:51:42

标签: c++

我有一张地图 typedef map<int32_t,std::vector<int32_t>> myMap

我在向量中添加了一个关于键的值,如

myMap[somePointer->getVal()].push_back(Id1);
myMap[somePointer->getVal()].push_back(Id2);
myMap[somePointer->getVal()].push_back(Id3);
myMap[somePointer->getVal()].push_back(Id4);

如果我想从键的向量中删除值,该怎么办? 我试过了 myMap[somePointer->getVal()].erase(Id1)

但是这个编译器会因错误而哭泣。

4 个答案:

答案 0 :(得分:1)

尝试此操作删除x+1元素

myMap[somePointer->getVal()].erase (myMap[somePointer->getVal()].begin()+x);

答案 1 :(得分:0)

documentation开始,synopsys是:

C ++ 98:

iterator erase (iterator position);
iterator erase (iterator first, iterator last);

C ++ 11:

iterator erase (const_iterator position);
iterator erase (const_iterator first, const_iterator last);

所以你必须给一个迭代器。

it = myMap[somePointer->getVal()].begin() + index;
myMap[somePointer->getVal()].erase(it)

您也可以尝试使用multimap

答案 2 :(得分:0)

向量不是为查找而设计的,因此接口不是基于值。如果要从矢量中删除,则需要知道位置。好处是您可以使用标准算法获取位置。代码的等价物是:

auto& vector = myMap[somePointer->getVal()];
auto it = std::find(vector.begin(), vector.end(), Id1);
if (it != vector.end()) { vector.erase(it); }

正如您所看到的那样,它比您原来的更长,更复杂。如果你在向量中有元素的位置(即如果你知道要删除第一个/最后一个/第n个元素),你可以用std::find替换通过begin()获得的正确迭代器。 ,end()和迭代器算术。

答案 3 :(得分:0)

对于C ++ 98或C ++ 11,erase有三种重载格式

C + 98

void erase (iterator position);
size_type erase (const key_type& k);
void erase (iterator first, iterator last);

C ++ 11

iterator  erase (const_iterator position);
size_type erase (const key_type& k);
iterator  erase (const_iterator first, const_iterator last);

所以你应该使用第二种格式删除

myMap.erase(somePointer->getVal()); // getVal() must return a type convertible to maps key_type

而不是

myMap[somePointer->getVal()].erase(Id1)