如果我们需要向 STL 中的 map 容器插入元素除了使用下标索引的形式和使用 insert 方法插入元素,还可以使用 emplace 方法和 emplace_hint 方法。
实现相同的插入操作,无论是用 emplace() 还是 emplace_hint(),都比 insert() 方法的效率高,和 insert() 方法相比,emplace() 和 emplace_hint() 方法的使用要简单很多,因为它们各自只有一种语法格式。
template <class... Args>
pair<iterator,bool> emplace (Args&&... args);
参数 | 说明 |
---|---|
args | 需要插入的键。 |
这里只需要将创建新键值对所需的数据作为参数直接传入即可,此方法可以自行利用这些数据构建出指定的键值对。另外,该方法的返回值也是一个 pair 对象,其中 pair.first 为一个迭代器,pair.second 为一个 bool 类型变量:
当该方法将键值对成功插入到 map 容器中时,其返回的迭代器指向该新插入的键值对,同时 bool 变量的值为 true;
当插入失败时,则表明 map 容器中存在具有相同键的键值对,此时返回的迭代器指向此具有相同键的键值对,同时 bool 变量的值为 false。
template <class... Args>
iterator emplace_hint (const_iterator position, Args&&... args);
参数 | 说明 |
---|---|
position | 需要插入的位置。 |
args | 需要插入的键。 |
该方法不仅要传入创建键值对所需要的数据,还需要传入一个迭代器作为第一个参数,指明要插入的位置(新键值对键会插入到该迭代器指向的键值对的前面);
该方法的返回值是一个迭代器,而不再是 pair 对象。当成功插入新键值对时,返回的迭代器指向新插入的键值对;反之,如果插入失败,则表明 map 容器中存有相同键的键值对,返回的迭代器就指向这个键值对。
使用 emplace 给 map 插入元素
#include <iostream>
#include <map>
using namespace std;
int main()
{
cout << "嗨客网(www.haicoder.net)\n" << endl;
//创建并初始化 map 容器
std::map<string, string>mymap;
//插入键值对
pair<map<string, string>::iterator, bool> ret = mymap.emplace("CPP教程", "https://haicoder.net/cpp/cpp-tutorial.html");
cout << "ret.iter = <{" << ret.first->first << ", " << ret.first->second << "}, " << ret.second << ">" << endl;
//插入新键值对
ret = mymap.emplace("C语言教程", "https://haicoder.net/c/c-tutorial.html");
cout << "ret.iter = <{" << ret.first->first << ", " << ret.first->second << "}, " << ret.second << ">" << endl;
//失败插入的样例
ret = mymap.emplace("CPP教程", "https://haicoder.net/golang/golang-tutorial.html");
cout << "ret.iter = <{" << ret.first->first << ", " << ret.first->second << "}, " << ret.second << ">" << endl;
return 0;
}
因为,这里需要使用 C++ 11,因此,我们在 Linux 下使用 g++ 进行编译,具体命令如下:
g++ map.cpp -std=c++11
编译后,我们直接运行生成的二进制文件 a.out
,如下图所示:
我们看到,我们使用了 emplace 将元素插入到了 map 中。
使用 emplace_hint 给 map 插入元素
#include <iostream>
#include <map>
using namespace std;
int main()
{
cout << "嗨客网(www.haicoder.net)\n" << endl;
//创建并初始化 map 容器
std::map<string, string>mymap;
//指定在 map 容器插入键值对
map<string, string>::iterator iter = mymap.emplace_hint(mymap.begin(),"CPP教程", "https://haicoder.net/cpp/cpp-tutorial.html");
cout << iter->first << " " << iter->second << endl;
iter = mymap.emplace_hint(mymap.begin(), "C语言教程", "https://haicoder.net/c/c-tutorial.html");
cout << iter->first << " " << iter->second << endl;
//插入失败样例
iter = mymap.emplace_hint(mymap.begin(), "CPP教程", "https://haicoder.net/cpp/cpp-tutorial.html");
cout << iter->first << " " << iter->second << endl;
return 0;
}
编译后,我们直接运行生成的二进制文件 a.out
,如下图所示:
我们看到,我们使用了 emplace_hint 将元素插入到了 map 中。
无论是用 emplace() 还是 emplace_hint(),都比 insert() 方法的效率高,和 insert() 方法相比,emplace() 和 emplace_hint() 方法的使用要简单很多,因为它们各自只有一种语法格式。