从键的向量中删除一个值
Delete a value from the vector for the key
我有一张地图,比如 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)
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 从链接列表c++中删除一个项目
- 删除映射和分割错误中的一个过去结束元素
- 使用另一个字符串从字符串中删除空格
- 编写一个函数来删除单链表中的节点(尾部除外),仅授予对该节点的访问权限
- 创建了一个链表,但如何删除 c++ 中的"所有"节点
- 如何知道地图中的最后一个元素是否被删除?
- G++ 发出警告,要求删除一个代码的数组,但不删除另一个代码的数组
- 动态分配列表 - 创建一个函数,用于删除所有包含偶数值的元素
- 如何删除矢量中的重复值,最后一个除外
- C++ 删除存在于另一个矢量中的矢量项,同时保留顺序
- 当类型适当的构造函数可用时,为什么一个编译器尝试使用已删除的副本构造函数
- 在 c++ 中打开文件、删除标点符号并追加到另一个文件中
- 删除链接列表中剩余的最后一个节点
- 编译器在C++中调用另一个函数时,在参数中查找已删除的构造函数
- 避免在使用链接列表从 deque 中删除最后一个节点时出现内存泄漏
- 在C++中为二叉搜索树创建一个删除函数
- 当编译一个删除停止字并应用大小写折叠的程序时,会出现一个奇怪的代码
- 为什么C++仍然有一个删除[]和一个删除运算符
- 一个删除行的函数