如何在没有额外副本的情况下从 std::map 安全地“弹出前端”?

RnM*_*Mss 3 c++ stl

我有一个std::map对象。

std::map<std::string, std::string> m;

m.insert({ "abcd", "foo" });
m.insert({ "1234", "bar" });
Run Code Online (Sandbox Code Playgroud)

我想获取并删除第一个元素,例如:

auto iter = m.begin();
auto [key, value] = std::move(*iter);
m.erase(iter);
do_something_with(key, value);
Run Code Online (Sandbox Code Playgroud)

这被认为是安全的吗?(从迭代器移动应该使键成为空字符串,这使得映射m无效。)

cig*_*ien 5

std::map::extract你可以这样使用:

auto nh = m.extract(m.begin());
Run Code Online (Sandbox Code Playgroud)

然后像这样使用键和值:

do_something(nh.key(), nh.mapped());
Run Code Online (Sandbox Code Playgroud)

这具有不需要制作额外副本的所需属性。