提问人:Morse 提问时间:10/6/2023 最后编辑:EvgMorse 更新时间:10/6/2023 访问量:109
处理右值时插入与放置
insert vs emplace when dealing with rvalues
问:
std::string myString;
std::unordered_set<std::string> mySet;
mySet.insert(std::move(myString));
mySet.emplace(std::move(myString)); // this is an example, in reality you can't move twice
我了解 和 之间的区别。但是,使用时有什么实际区别吗?哪一个更可取?insert
emplace
std::move
答:
3赞
Drew Dormann
10/6/2023
#1
差异很少或没有,具体取决于容器类型。
如果容器中已存在相等的元素,则选择的容器 可能无法插入/置入。std::unordered_set
在这种失败的情况下,可能会执行一些额外的步骤,即分配一个节点并在那里构造对象(以执行哈希),然后销毁该对象并解除分配该节点。emplace
当您知道要传递的类型是包含的类型时,首选insert
评论
0赞
HolyBlackCat
10/6/2023
有趣!我想知道是否也允许执行此优化。.emplace()
0赞
Drew Dormann
10/6/2023
很荣幸能赶上@HolyBlackCat的插曲......cppreference 对此方案使用单词“may”
0赞
HolyBlackCat
10/6/2023
我问过这个,希望不是骗子......
评论