C++ c++;:按键从std::map中弹出元素

C++ c++;:按键从std::map中弹出元素,c++,map,stl,C++,Map,Stl,我感兴趣的是从映射中删除具有特定键的元素并使用该元素 看起来像: itr = MyMap.pop(wantedKey); //Now MyMap is missing the element which has the key 'wantedKey'. //Do something with this element through 'itr'. 有没有一种stl映射方法可以实现这一点 编辑 根据carleeto的回答,我想澄清一下:我需要的是从映射中删除元素,然后程序能够使用它,它可以是元素

我感兴趣的是从映射中删除具有特定键的元素并使用该元素

看起来像:

itr = MyMap.pop(wantedKey);
//Now MyMap is missing the element which has the key 'wantedKey'.
//Do something with this element through 'itr'.
有没有一种stl映射方法可以实现这一点

编辑


根据carleeto的回答,我想澄清一下:我需要的是从映射中删除元素,然后程序能够使用它,它可以是元素本身作为一对,而不一定是迭代器

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

// 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
}

据我所知不是这样,但您可以使用获取一个迭代器,然后在完成后使用所述迭代器作为参数进行调用。

可能您想要做的是

itr=MyMap.find('thing in a string')

要找到迭代器并使用它

MyMap.erase(itr)

然后将其删除。

Pop()属于堆栈数据结构。要访问映射的元素,请使用[]运算符(),将其从映射使用()中删除

使用C++的
std::map::find()


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

itr = MyMap.pop(wantedKey);
//Do something with this element through 'itr'.
迭代器只指向容器中的元素。因此,如果您通过一个名为pop的函数接收到迭代器(即使它存在),迭代器将引用的不是您弹出的元素,而是它后面或之前的元素,如。这是因为迭代器的目的是迭代容器中的元素。因此,如果某个元素不在容器中,则无法获取该元素的迭代器。但是,即使您使用了erase函数返回的迭代器,它也会被删除

所以你可以从映射中删除一个元素,就像很多人指出的那样,通过搜索它,找到它的ierator,然后用迭代器调用erase。但您无法获得指向已擦除元素的迭代器。希望这能把事情弄清楚

更新:如果您只想访问元素并使用它,那么在使用完迭代器后,您只需要使用std::map::find来获取迭代器,并使用std::map::erase从映射中删除该项。原因是,即使您存储了迭代器的副本以供将来使用,一旦调用erase,它也将无效。要在擦除后访问它,可能需要复制它,具体取决于范围


最后,您要做的是一项非常常见的任务—根据键查找映射并对相关元素执行操作。很可能你有一系列的钥匙要检查。你也应该向上看,然后。我意识到,在您移除元素后,它不会在元素上运行,但我想我会添加它,看看它是如何相关的操作。例如:您可以将与键列表匹配的所有元素移动到另一个容器中(例如,向量,然后使用上面的方法对它们进行操作)。

我的操作方式如下。在我的例子中,映射存储std::shared_ptr值,使得拷贝便宜(ish),对象所有权转移清晰

auto it = MyMap.find( wantedkey );
if ( it == MyMap.end() ) throw runtime_error("not found");
auto ret = it->second;          // make copy of shared_ptr
MyMap.erase(it);
return ret;

调用方(从副本)获取引用计数至少为一的共享_ptr。注意:函数必须按值返回共享的ptr,等等。

我没有使用c++11,只是好奇:这种方式是否也允许使用元素?@Subway“使用”是什么意思?“使用”是指询问它的值是什么等。你可以通过
m[key]
找到该值,它将返回与该键配对的值。这就是你的意思吗?这正是我的意思,但我想问的是,这可以在移除的同时完成。非常感谢你的解释。这是迄今为止最好的答案。但是让我们尝试一点不同的方法:我会很满意地得到一对元素并使用它。感谢您的详细说明。只是一个小评论,描述我的任务。你忘了提到我也想删除元素。:)是的,你说得对。我没有,因为我不想把事情复杂化太多。如果您有一个键列表和一个映射,您可以迭代键列表,对于每个键,在映射中找到相应的元素,对其进行操作,然后在一个步骤中从映射中删除该元素。然而,这需要了解BOOST库,尤其是BOOST::lambda和BOOST::bind。理解Boost的一个先决条件是理解C++ STL库。好主意:)你可以用
autox=std::move(i->second)移动或删除C++11中的用法+1@Casey。为什么我没想到呢?我已相应地修改了我的答案。
itr = MyMap.pop(wantedKey);
//Do something with this element through 'itr'.
auto it = MyMap.find( wantedkey );
if ( it == MyMap.end() ) throw runtime_error("not found");
auto ret = it->second;          // make copy of shared_ptr
MyMap.erase(it);
return ret;