c++ - 从 multimap (C++) 中完全删除元素

标签 c++ stl containers multimap erase

所以我有一个 multimap,其中键是一个结构,值是另一个结构。

multimap<struct, struct> multimap1;

multimap1包含(格式为key:value)

1: Random Value 1
2: Random Value 2
3: Random Value 3
4: Random Value 4

我正在尝试从多重映射中删除一个值和一个。假设我想删除 multimap 的第二个条目。结果应该是这样的:

1: Random Value 1
3: Random Value 3
4: Random Value 4

我有一个指向第二个的迭代器,所以当我使用multimap1.erase(it)删除它时,它应该删除第二个条目(至少我认为应该)。我一直在阅读有关删除条目和从多映射中删除的内容,似乎只有值从多映射中删除,而不是键。因此,如果用指向第二个的迭代器删除第二个条目,它会这样做(如果我错了请纠正我):

1: Random Value 1
2: 
3: Random Value 3
4: Random Value 4

有没有办法得到中间值的结果?

编辑:所以我显然错了。如果你删除,你会得到中间的结果。我试图弄清楚为什么我没有正确删除,因为当我调用删除时我的代码出现段错误。如果我调用 it->first,它会返回我要删除的元素的键。如果我调用 it->second,它会返回该键的值。所以如果我调用 multimap.erase(it),它应该删除整个东西,对吗?

编辑 2:在我的代码中,我打印了 it->firstit->second 以确保指针指向正确的元素并且它曾是。当我调用 multimap.erase(it) 时,我停止了循环并打印出 multimap 中剩余的元素。它正确地打印了第一个元素,但随后打印了第二个元素,如下所示(编译器的输出):

GEWolfC?`6??2?x3??2??2?x 1@4?????BUYA????BadWolfCorp1????AMstyKrq?4?X3??(4??3?    
X3PlanetExpress1GEqp7?L???5?d?5?x5??5?d2q7?7?X3??(4??3?X3??

很明显,它没有正确删除。我在 Linux 上运行 g++ 4.7。

编辑 3:抱歉进行了如此多的编辑,我想保留原始问题,以便人们将来可以引用。只是为了实验,我调用了 multimap.erase(it->first) 并且它工作正常。有人可以向我解释为什么这有效以及这里发生了什么吗?

最佳答案

erase 会根据需要删除整个条目(“键值对”)。

有时,在谈论映射类型时会出现混淆,因为库规范将 value_type 定义为表示“键值”对,而不仅仅是“值”(定义为 mapped_type );所以“值(value)”这个词可以互换使用,表示一个或另一个。

关于c++ - 从 multimap (C++) 中完全删除元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15742075/

相关文章:

c++ - 正则表达式和 boost

c++ - 为什么 fork() 会导致重复输出?

c++ - 引用双指针,值是多少?

C++ 使用带有 count() 函数的列表

.net - 如何在 Docker 容器中安装带有 SQL Server 的 .NET 4.7.2

c++ - C++ STL vector/列表容器的 Python 等效项

c++ - 如何确定哪些库是动态加载的?

c++ - 在容器中删除 std::map 元素的有效方法

c++ - 比较两个 3D vector

docker - 有没有办法知道 docker 容器是否在另一个容器中重新启动?