我们在使用stl的映射容器std::map时,经常需要向容器中插入数据。由于map的元素key值是唯一的,我们经常遇到这样的场景:
- 向map中插入元素时,指定的key已经存在则直接更新;
- 指定的key不存在,然后才做插入操作;
通用的做法,可以直接用emplace操作,判断指定的key是否存在,如果不存在,则插入元素。当元素存在的时候,emplace依然会构造一次带待插入元素,判断不需要插入后,将该元素析构,这样导致的后果是,产生了多余的构造和析构操作。
C++17引入了std::try_emplace方法,在参数列表中,把key和value分开,该方法会检测指定的key是否存在,如果存在,什么也不做,不存在,则插入相应的value。
此外,C++17为map容器还新增了insert_or_assign方法,让我们无需像之前一样,额外编写先判断是否存在,不存在则插入,存在则更新的代码了。
#include <iostream>
#include <string>
#include <map>
using namespace std;
int main()
{
map<string, string> mapTest{ {"花木兰","边路"},{"甄姬","中单"},
{"后羿","射手"},{"蔡文姬","射手"},{"东方曜","打野"} };
auto [hero, position] = mapTest.try_emplace("韩信", "第六人");
for (auto [h, p] : mapTest)
{
cout << h << ":" << p << endl;
}
cout << "--------------------------------------------------" << endl;
auto [hero1, position1] = mapTest.try_emplace("东方曜","边路");
for (auto [h, p] : mapTest)
{
cout << h << ":" << p << endl;
}
cout << "--------------------------------------------------" << endl;
auto [hero2, position2] = mapTest.insert_or_assign("东方曜", "边路");
for (auto [h, p] : mapTest)
{
cout << h << ":" << p << endl;
}
cout << "--------------------------------------------------" << endl;
auto [hero3, position3] = mapTest.insert_or_assign("马超", "龙虎双边");
for (auto [h, p] : mapTest)
{
cout << h << ":" << p << endl;
}
return 0;
}