首页 > STL > STL无序关联式容器
C++ unordered_map emplace()和emplace_hint()方法
和前面学的 map、set 等容器一样,C++ 11 标准也为 unordered_map 容器新增了 emplace() 和 emplace_hint() 成员方法,本节将对它们的用法做详细的介绍。
我们知道,实现向已有 unordered_map 容器中添加新键值对,可以通过调用 insert() 方法,但其实还有更好的方法,即使用 emplace() 或者 emplace_hint() 方法,它们完成“向容器中添加新键值对”的效率,要比 insert() 方法高。
另外需要注意的是,该方法的返回值为 pair 类型值,其包含一个迭代器和一个 bool 类型值:
举个例子:
我们知道,实现向已有 unordered_map 容器中添加新键值对,可以通过调用 insert() 方法,但其实还有更好的方法,即使用 emplace() 或者 emplace_hint() 方法,它们完成“向容器中添加新键值对”的效率,要比 insert() 方法高。
至于为什么 emplace()、emplace_hint() 执行效率会比 insert() 方法高,可阅读《为什么emplace()、emplace_hint()执行效率比insert()高》一文,虽然此文的讲解对象为 map 容器,但就这 3 个方法来说,unordered_map 容器和 map 容器是一样的。
unordered_map emplace()方法
emplace() 方法的用法很简单,其语法格式如下:
template <class... Args>
pair<iterator, bool> emplace ( Args&&... args );
另外需要注意的是,该方法的返回值为 pair 类型值,其包含一个迭代器和一个 bool 类型值:
- 当 emplace() 成功添加新键值对时,返回的迭代器指向新添加的键值对,bool 值为 True;
- 当 emplace() 添加新键值对失败时,说明容器中本就包含一个键相等的键值对,此时返回的迭代器指向的就是容器中键相同的这个键值对,bool 值为 False。
举个例子:
#include <iostream> #include <string> #include <unordered_map> using namespace std; int main() { //创建 umap 容器 unordered_map<string, string> umap; //定义一个接受 emplace() 方法的 pair 类型变量 pair<unordered_map<string, string>::iterator, bool> ret; //调用 emplace() 方法 ret = umap.emplace("STL教程", "https://www.xinbaoku.com/stl/"); //输出 ret 中包含的 2 个元素的值 cout << "bool =" << ret.second << endl; cout << "iter ->" << ret.first->first << " " << ret.first->second << endl; return 0; }程序执行结果为:
bool =1
iter ->STL教程 https://www.xinbaoku.com/stl/
unordered_map emplace_hint()方法
emplace_hint() 方法的语法格式如下:
template <class... Args>
iterator emplace_hint ( const_iterator position, Args&&... args );
- emplace_hint() 方法的返回值仅是一个迭代器,而不再是 pair 类型变量。当该方法将新键值对成功添加到容器中时,返回的迭代器指向新添加的键值对;反之,如果添加失败,该迭代器指向的是容器中和要添加键值对键相同的那个键值对。
- emplace_hint() 方法还需要传递一个迭代器作为第一个参数,该迭代器表明将新键值对添加到容器中的位置。需要注意的是,新键值对添加到容器中的位置,并不是此迭代器说了算,最终仍取决于该键值对的键的值。
举个例子:可以这样理解,emplace_hint() 方法中传入的迭代器,仅是给 unordered_map 容器提供一个建议,并不一定会被容器采纳。
#include <iostream> #include <string> #include <unordered_map> using namespace std; int main() { //创建 umap 容器 unordered_map<string, string> umap; //定义一个接受 emplace_hint() 方法的迭代器 unordered_map<string,string>::iterator iter; //调用 empalce_hint() 方法 iter = umap.emplace_hint(umap.begin(),"STL教程", "https://www.xinbaoku.com/stl/"); //输出 emplace_hint() 返回迭代器 iter 指向的键值对的内容 cout << "iter ->" << iter->first << " " << iter->second << endl; return 0; }程序执行结果为:
iter ->STL教程 https://www.xinbaoku.com/stl/
所有教程
- C语言入门
- C语言编译器
- C语言项目案例
- 数据结构
- C++
- STL
- C++11
- socket
- GCC
- GDB
- Makefile
- OpenCV
- Qt教程
- Unity 3D
- UE4
- 游戏引擎
- Python
- Python并发编程
- TensorFlow
- Django
- NumPy
- Linux
- Shell
- Java教程
- 设计模式
- Java Swing
- Servlet
- JSP教程
- Struts2
- Maven
- Spring
- Spring MVC
- Spring Boot
- Spring Cloud
- Hibernate
- Mybatis
- MySQL教程
- MySQL函数
- NoSQL
- Redis
- MongoDB
- HBase
- Go语言
- C#
- MATLAB
- JavaScript
- Bootstrap
- HTML
- CSS教程
- PHP
- 汇编语言
- TCP/IP
- vi命令
- Android教程
- 区块链
- Docker
- 大数据
- 云计算