C++ “如何安全”;“流行前沿”;从std::map不带额外副本?
我有一个C++ “如何安全”;“流行前沿”;从std::map不带额外副本?,c++,stl,C++,Stl,我有一个std::map对象 std::map<std::string, std::string> m; m.insert({ "abcd", "foo" }); m.insert({ "1234", "bar" }); 这样安全吗? (从迭代器中移动应该使键成为空字符串,这使得m映射无效。) 这样安全吗 如果地图不是空的,是的 但是请注意,该键将是一个深度副本;一个也没动。这是因为map元素的键是c
std::map
对象
std::map<std::string, std::string> m;
m.insert({ "abcd", "foo" });
m.insert({ "1234", "bar" });
这样安全吗?
(从迭代器中移动应该使键成为空字符串,这使得m
映射无效。)
这样安全吗
如果地图不是空的,是的
但是请注意,该键将是一个深度副本;一个也没动。这是因为map元素的键是const
如何从std::map安全地“弹出前端”,而无需额外拷贝
如果使用提取
成员功能,也可以从该键移动:
auto handle = m.extract(m.begin());
// if you need separate objects:
auto key = std::move(handle.key());
auto mapped = std::move(handle.mapped());
使用std映射提取。使用生成的节点句柄,将键/值移动到键/值变量 在提取std映射之前,这是不完全可能的。添加了std map extract以允许您执行此操作,以及类似的操作,如拼接贴图。您可以这样使用:
auto nh = m.extract(m.begin());
do_something(nh.key(), nh.mapped());
然后使用如下键和值:
auto nh = m.extract(m.begin());
do_something(nh.key(), nh.mapped());
这具有不制作额外副本的所需属性