从键的向量中删除一个值

Delete a value from the vector for the key

本文关键字:一个 删除 向量      更新时间:2023-10-16

我有一张地图,比如 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)

但是有了这个编译器,就会出现错误。

尝试删除第 x+1 个元素

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

从文档中看,概要是:

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

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

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()和迭代器算术得到的正确迭代器。

对于 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)