【C++11/17】std::map高效插入

我们在使用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 
#include 
#include 

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;
}

【C++11/17】std::map高效插入_第1张图片

你可能感兴趣的:(c++,C++17,try_emplace)