STL-几种插入解析

概述

STL 常见的插入有如下几种

  1. insert,insert_after
  2. push_back,push_front
  3. emplace,emplace_hint,emplace_front,emplace_back,try_emplace

vector系列

此处详解 push_backemplace_back。虽然两者都是向尾部添加元素,但有些许差别。

push_back 与 insert

当使用push_back或者insert添加时,首先会构造这个函数,然后在调用移动或者拷贝 (优先调用移动构造函数,当移动构造函数无法使用时才会调用拷贝构造函数) 构造函数将元素移到尾部,再删除之前构造的临时对象。

emplace_back

而当使用emplace_back时,则会直接在尾部调用构造或移动构造 (当传入为右值且有对应的移动构造函数时) 构造该对象,省去了拷贝以及移动的过程。

注意此函数使用场景需支持 C++11

map系列

此处详解 emplacetry_emplace。虽然都是直接调用构造函数,但也有些许区别。

emplace 与 emplace_hint

emplace使用和原理与上面的emplace_back一致,返回值为pair<iterator,bool>第二个 bool 表示是否插入成功。

emplace_hint则仅在使用上略微有区别,其需传入一个迭代器参数,将需要插入的对象放在这个迭代器的位置,并且该函数返回值与前面的不同,当成功插入新键值对时,返回的迭代器指向新插入的键值对;反之,如果插入失败,则表明 map 容器中存有相同键的键值对,返回的迭代器就指向这个键值对。

注意此函数使用场景需支持 C++11

try_emplace

会在插入时检测容器内是否有相同的键,当存在时不做任何事,否则与上面的一致。

该函数也有两种返回值,使用方法与上面两种一致,

注意此函数使用场景需支持 C++17