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

时间:2013-06-10 20:58:40

标签: 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 map方法来执行此操作?

修改

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

8 个答案:

答案 0 :(得分: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
}

答案 1 :(得分:4)

我不知道,但您可以使用std::map::find获取迭代器,然后在完成后使用所述迭代器作为参数调用std::map::erase

答案 2 :(得分:1)

从你的变量命名,我想你可能会在这里混淆概念。

itr = MyMap.pop(wantedKey);
//Do something with this element through 'itr'.

迭代器只指向容器中的元素。因此,如果您通过一个名为pop的函数(即使它存在)收到了迭代器,迭代器将不会引用您弹出的元素,而是可能引用它之后或之前的元素,如std::vector::erase。这是因为迭代器的目的是迭代容器中的元素。因此,如果元素不在容器中,则无法获取它的迭代器。但是,即使您使用了擦除函数返回的迭代器,它也是would not reference you would be expecting it to

所以你可以从地图中删除一个元素,就像许多人已经指出的那样,通过搜索它,获取ierator然后用该迭代器调用erase。但是你不能得到一个指向你已经删除的元素的迭代器。希望这可以解决问题。

更新:如果你想要的只是访问元素并使用它,那么你需要做的就是使用std :: map :: find来获取一个迭代器和std :: map :: erase来从中删除项目完成使用迭代器后映射。原因是即使您存储了迭代器的副本以供将来使用,一旦调用erase,它将被无效。为了能够在删除它后访问它,根据范围,您可能需要复制它。

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

答案 3 :(得分:0)

你想做的可能是

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

找到迭代器然后使用它,

MyMap.erase(itr)

然后将其删除。

答案 4 :(得分:0)

Pop()属于堆栈数据结构。要访问地图元素,请使用[]运算符(http://www.cplusplus.com/reference/map/map/operator%5B%5D/)将其从地图使用中删除(http://www.cplusplus.com/reference/map/map/erase/)。

答案 5 :(得分:0)

itr = MyMap.find(wantedKey);
if(itr != MyMap.end()) {
  use( itr->second );
  MyMap.erase(itr);
}
your.uncle = bob;

答案 6 :(得分:0)

使用C ++的std::map<T, U>::find()

map.erase(map.find(key));

答案 7 :(得分:0)

我这样做的方式如下。在我的情况下,地图存储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;

调用者获取一个shared_ptr,其引用计数至少为1(来自副本)。注意,该函数必须按值返回shared_ptr等。