概述
STL 常见的插入有如下几种
- insert,insert_after
- push_back,push_front
- emplace,emplace_hint,emplace_front,emplace_back,try_emplace
vector系列
此处详解 push_back
与emplace_back
。虽然两者都是向尾部添加元素,但有些许差别。
push_back 与 insert
当使用push_back
或者insert
添加时,首先会构造这个函数,然后在调用移动或者拷贝 (优先调用移动构造函数,当移动构造函数无法使用时才会调用拷贝构造函数) 构造函数将元素移到尾部,再删除之前构造的临时对象。
emplace_back
而当使用emplace_back
时,则会直接在尾部调用构造或移动构造 (当传入为右值且有对应的移动构造函数时) 构造该对象,省去了拷贝以及移动的过程。
注意此函数使用场景需支持 C++11。
map系列
此处详解 emplace
与 try_emplace
。虽然都是直接调用构造函数,但也有些许区别。
emplace 与 emplace_hint
emplace
使用和原理与上面的emplace_back
一致,返回值为pair<iterator,bool>
第二个 bool 表示是否插入成功。
而emplace_hint
则仅在使用上略微有区别,其需传入一个迭代器参数,将需要插入的对象放在这个迭代器的位置,并且该函数返回值与前面的不同,当成功插入新键值对时,返回的迭代器指向新插入的键值对;反之,如果插入失败,则表明 map 容器中存有相同键的键值对,返回的迭代器就指向这个键值对。
注意此函数使用场景需支持 C++11。
try_emplace
会在插入时检测容器内是否有相同的键,当存在时不做任何事,否则与上面的一致。
该函数也有两种返回值,使用方法与上面两种一致,
注意此函数使用场景需支持 C++17。