我有一张地图
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)
但是这个编译器会因错误而哭泣。
答案 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)