1

所以我有一个多重映射,其中键是一个结构,值是另一个结构。

multimap<struct, struct> multimap1;

multimap1包含(格式为key:)value

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

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

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),我停止了循环并打印出多图中的剩余元素。它正确打印了第一个元素,但随后打印了第二个元素,如下所示(编译器的输出):

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)它并且工作正常。有人可以向我解释为什么这有效以及这里发生了什么吗?

4

1 回答 1

1

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

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

于 2013-04-01T10:55:58.680 回答