关联式容器
关联式容器,包括 map、multimap、set 以及 multiset 这 4 种容器。
和序列式容器不同的是,关联式容器在存储元素时还会为每个元素在配备一个键,整体以键值对的方式存储到容器中。相比前者,关联式容器可以通过键值直接找到对应的元素,而无需遍历整个容器。另外,关联式容器在存储元素,默认会根据各元素键值的大小做升序排序。
相比其它类型容器,关联式容器查找、访问、插入和删除指定元素的效率更高。
弃用序列式容器,转而选用关联式容器存储元素,往往就是看中了关联式容器可以快速查找、读取或者删除所存储的元素,同时该类型容器插入元素的效率也比序列式容器高。
#include#include
#include#include // pair #include // string using namespace std; int main() { // 调用构造函数 1,也就是默认构造函数 pair pair1; // 调用第 2 种构造函数 pair pair2("STL教程","http://c.biancheng.net/stl/"); // 调用拷贝构造函数 pair pair3(pair2); //调用移动构造函数 pair pair4(make_pair("C++教程", "http://c.biancheng.net/cplus/")); // 调用第 5 种构造函数 pair pair5(string("Python教程"), string("http://c.biancheng.net/python/")); cout << "pair1: " << pair1.first << " " << pair1.second << endl; cout << "pair2: "<< pair2.first << " " << pair2.second << endl; cout << "pair3: " << pair3.first << " " << pair3.second << endl; cout << "pair4: " << pair4.first << " " << pair4.second << endl; cout << "pair5: " << pair5.first << " " << pair5.second << endl; return 0; }
作为关联式容器的一种,map 容器存储的都是 pair 对象,也就是用 pair 类模板创建的键值对。其中,各个键值对的键和值可以是任意数据类型,包括 C++ 基本数据类型(int、double 等)、使用结构体或类自定义的类型。
通常情况下,map 容器中存储的各个键值对都选用 string 字符串作为键的类型。
#include#include
emplace() 方法的语法格式如下:
template
pair
参数 (Args&&… args) 指的是,这里只需要将创建新键值对所需的数据作为参数直接传入即可,此方法可以自行利用这些数据构建出指定的键值对。另外,该方法的返回值也是一个 pair 对象,其中 pair.first 为一个迭代器,pair.second 为一个 bool 类型变量:
当该方法将键值对成功插入到 map 容器中时,其返回的迭代器指向该新插入的键值对,同时 bool 变量的值为 true;
当插入失败时,则表明 map 容器中存在具有相同键的键值对,此时返回的迭代器指向此具有相同键的键值对,同时 bool 变量的值为 false。
#include#include
emplace_hint() 方法的功能和 emplace() 类似,其语法格式如下:
template
iterator emplace_hint (const_iterator position, Args&&… args);
显然和 emplace() 语法格式相比,有以下 2 点不同:
该方法不仅要传入创建键值对所需要的数据,还需要传入一个迭代器作为第一个参数,指明要插入的位置(新键值对键会插入到该迭代器指向的键值对的前面);
该方法的返回值是一个迭代器,而不再是 pair 对象。当成功插入新键值对时,返回的迭代器指向新插入的键值对;反之,如果插入失败,则表明 map 容器中存有相同键的键值对,返回的迭代器就指向这个键值对。
下面程序演示 emplace_hint() 方法的用法:
#includemultimap#include //map #include //string using namespace std; int main() { //创建并初始化 map 容器 std::map mymap; //指定在 map 容器插入键值对 map ::iterator iter = mymap.emplace_hint(mymap.begin(),"STL教程", "http://c.biancheng.net/stl/"); cout << iter->first << " " << iter->second << endl; iter = mymap.emplace_hint(mymap.begin(), "C语言教程", "http://c.biancheng.net/c/"); cout << iter->first << " " << iter->second << endl; //插入失败样例 iter = mymap.emplace_hint(mymap.begin(), "STL教程", "http://c.biancheng.net/java/"); cout << iter->first << " " << iter->second << endl; return 0; }
multimap 容器。
所谓“相似”,指的是 multimap 容器具有和 map 相同的特性,即 multimap 容器也用于存储 pair
和 map 容器一样,实现 multimap 容器的类模板也定义在
#include
using namespace std;
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)