c ++:从std :: map中按键弹出一个元素

Sub*_*way 4 c++ stl map

我有兴趣从地图中删除具有特定键的元素并使用此元素.

看起来像:

itr = MyMap.pop(wantedKey);
//Now MyMap is missing the element which has the key 'wantedKey'.
//Do something with this element through 'itr'.
Run Code Online (Sandbox Code Playgroud)

这样做有stl map方法吗?

编辑

carleeto的回复之后,我想澄清一下:我需要的是从地图中删除的元素以及之后能够使用它的程序,它可以是元素本身作为一对,不一定是迭代器.

Mar*_*tos 10

有两种选择:就地使用然后将其删除,或将其移动到局部变量,删除条目,然后使用它.

// use-remove
auto i = MyMap.find(wantedKey);
if (i != MyMap.end()) {
    // use-remove
    use(i->second);
    MyMap.erase(i);

    // or

    // move-remove-use
    auto x = std::move(i->second);
    MyMap.erase(i);
    use(x);
} else {
    // Not found
}
Run Code Online (Sandbox Code Playgroud)


Car*_*arl 1

从你的变量命名来看,我认为你可能会混淆这里的概念。

itr = MyMap.pop(wantedKey);
//Do something with this element through 'itr'.
Run Code Online (Sandbox Code Playgroud)

迭代器仅指向容器中的元素。因此,如果您通过名为 pop 的函数接收到迭代器(即使它存在),则迭代器不会引用您弹出的元素,而可能引用它之后或之前的元素,例如std::vector::erase。这是因为迭代器的目的是迭代容器中的元素。因此,如果某个元素不在容器中,则无法获取它的迭代器。但是,即使您使用擦除函数返回的迭代器,它也不会引用您所期望的

因此,您可以从映射中删除一个元素,就像很多人指出的那样,通过搜索它,获取它的迭代器,然后使用该迭代器调用擦除。但您无法获得指向已删除元素的迭代器。希望这能解决问题。

更新:如果您想要的只是访问该元素并使用它,那么您只需使用 std::map::find 获取迭代器并使用 std::map::erase 从地图中删除该项目一次您已经完成了迭代器的使用。原因是,即使你已经存储了迭代器的副本以供将来使用,一旦你调用擦除,它也会失效。为了能够在删除它后访问它,根据范围,您可能需要复制它。

最后,您要做的是一个非常常见的任务 - 根据键查找映射并对关联元素执行操作。您很可能有一个按键列表需要检查。您还应该查找functorsstd::for_eachstd::transform。我意识到在删除元素后这不会对元素进行操作,但我想我会将其添加进去,看看它是如何相关的操作。例如:您可以将与键列表匹配的所有元素移动到另一个容器(例如向量,然后使用上面的内容对它们进行操作)。