关联式容器
- 关联式容器与序列式容器不同的是,关联式容器在存储元素时还会为每个元素在配备一个键,整体以键值对的方式存储到容器中。
- 关联式容器可以通过键值对< key,value >直接找到对应元素,无序遍历整个容器
- 管理师容器在存储元素,默认会根据各元素键值的大小做升序排序
- 关联式容器查找、访问、插入和删除指定元素的效率更高
| 关联式容器名称 |
特点 |
| map |
定义在 < map> 头文件中,使用该容器存储的数据,其各个元素的键必须是唯一的(即不能重复),该容器会根据各元素键的大小,默认进行升序排序(调用 std::less< T>)。 |
| set |
定义在 < set> 头文件中,使用该容器存储的数据,各个元素键和值完全相同,且各个元素的值不能重复(保证了各元素键的唯一性)。该容器会自动根据各个元素的键(其实也就是元素值)的大小进行升序排序(调用 std::less< T>)。 |
| multimap |
定义在 < map> 头文件中,和 map 容器唯一的不同在于,multimap 容器中存储元素的键可以重复。 |
| multiset |
定义在 < set> 头文件中,和 set 容器唯一的不同在于,multiset 容器中存储元素的值可以重复(一旦值重复,则意味着键也是重复的)。 |
- <“C语言教程”, “http://c.biancheng.net/c/”>
第一个元素作为键(key),第二个元素作为值(value),由于**“键值对”并不是普通类型数据,因此STL标准库提供pair类模板**,专门用来将2个普通元素first和second(可以是c++基本数据类型,结构体,类自定义的类型)创建成一个新元素< first,second>.
- pair类模板定义在< utility >头文件中
#1) 默认构造函数,即创建空的 pair 对象
pair();
#2) 直接使用 2 个元素初始化成 pair 对象
pair (const first_type& a, const second_type& b);
#3) 拷贝(复制)构造函数,即借助另一个 pair 对象,创建新的 pair 对象
template<class U, class V> pair (const pair<U,V>& pr);
#4) 移动构造函数
template<class U, class V> pair (pair<U,V>&& pr);
#5) 使用右值引用参数,创建 pair 对象
template<class U, class V> pair (U&& a, V&& b);
#include
#include
#include
using namespace std;
int main() {
pair <string, double> pair1;
pair1.first = "数学教程";
pair <string, string> pair2("STL教程", "http://c.biancheng.net/stl/");
pair <string, string> pair3(pair2);
pair <string, string> pair4(make_pair("C++教程", "http://c.biancheng.net/cplus/"));
pair <string, string> 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;
if (pair4 != pair2) {
cout << "pair != pair2" << endl;
}
if (pair2 != pair3) {
cout << "pair2 != pair3" << endl;
}
pair <string, int> pair8("pair", 10);
pair <string, int> pair9("pair2", 20);
pair8.swap(pair9);
cout << "pair8: " << pair8.first << " " << pair8.second << endl;
cout << "pair9: " << pair9.first << " " << pair9.second << endl;
return 0;
}

- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
map 映射表
- map容器存储的都是pair对象,因此各个键值对的键和值可以是任意数据类型
该容器存储的都是 pair 类型(其中 K 和 T 分别表示键和值的数据类型)的键值对元素。
- 使用该容器存储的数据,其各个元素的键必须是唯一的且不能被修改(即不能重复),该容器会根据各元素键的大小,默认进行升序排序(调用 std::less< T>)
- 手动指定map容器的排序规则,std::greater< T >
- 底层是红黑树
| 成员方法 |
功能 |
| begin() |
返回指向容器中第一个(注意,是已排好序的第一个)键值对的双向迭代器。如果 map 容器用 const 限定,则该方法返回的是 const 类型的双向迭代器。 |
| end() |
返回指向容器最后一个元素(注意,是已排好序的最后一个)所在位置后一个位置的双向迭代器,通常和 begin() 结合使用。如果 map 容器用 const 限定,则该方法返回的是 const 类型的双向迭代器。 |
| rbegin() |
返回指向最后一个(注意,是已排好序的最后一个)元素的反向双向迭代器。如果 map 容器用 const 限定,则该方法返回的是 const 类型的反向双向迭代器。 |
| rend() |
返回指向第一个(注意,是已排好序的第一个)元素所在位置前一个位置的反向双向迭代器。如果 map 容器用 const 限定,则该方法返回的是 const 类型的反向双向迭代器。 |
| cbegin() |
和 begin() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改容器内存储的键值对。 |
| cend() |
和 end() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改容器内存储的键值对。 |
| crbegin() |
和 rbegin() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改容器内存储的键值对。 |
| crend() |
和 rend() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改容器 |