emplace系列函数
先上一段常用的代码:
1 |
|
在这个过程中,我们的目的是为了产生一个对象数组,为了产生3个对象,调用了3*3次,这个过程执行过程:创建对象t调用构造函数—>调用对象t的拷贝构造函数放入集合—>调用析构函数。
C++11 提供了一个新的方法代替emplace_back
1 | std::vector<Test> vec; |
emplace操作被称为 “原位构造元素”
同理的方法 如下:
原方法 | C++11 改进方法 | 含义 |
---|---|---|
push/insert | emplace | 指定位置原位构造元素 |
push_front | emplace_front | 首部原位构造元素 |
push_back | emplace_back | 尾部原位构造元素 |
std::map的try_emplace 与 insert_or_assign方法
由于map中的key是唯一的,因此在开发中经常遇到往map中插入数据之前需要先验证key是否存在,C++17中map提供了一个try_emplace方法,该方法会检测指定的key是否存在,函数签名如下:
1 | template <class... Args> |
其中k表示需要插入的key,args不定参数表示构造value对象所需的参数列表,hint表示插入位置。
前两种形式中,返回值是std::pair<T1,T2>,其中T2是个bool表示,当前插入操作成功与否,T1是一个迭代器,如果插入成功,则指向插入位置的元素迭代器,如果失败,则指向相同key元素的迭代器。
后两种不常用,在map中插入时很少关心插入位置。
示例:
1 |
|
try_emplace是map中指定的key存在就失败,不存在就插入,还有另一个方法insert_or_assign 当key存在时就更新value,不存在时就插入。
insert_or_assign函数签名:
1 | template <class M> |
使用示例
1 | std::map<std::string, std::string> m; |