关联容器map-pair-set

关联容器支持关键字查找和访问,主要有mapset这两种关键字。

map中的元素是关键字-值(key-value)对,map是有序的容器,元素的排序按照每个元素中的关键字排序。关键字起到索引作用,值是关键字对应的数据。

set中的元素只有关键字,set支持查询作用——检索某些内容是否在容器内。

除了map,set外还有mulimap,muliset,以及对应这四种的无序形式unordered_map,unordered_set, unordered_mulimap,unordered_muliset,这里不介绍这六种。

参考 CPLUSPLUS网站

map

1 创建map

map是模板类,形如 map<T1,T2>

1
2
3
map<string, int> mp = { {"a",1},{"d",4}, {"b",2} };
// 这里定义的一个map对象mp,它的关键字类型是string,值类型int
用三个元素对它进行初始化。

注意:: 对上面对象mp初始化中三个元素的顺序是{“a”,1},{“d”,4}, {“b”,2},但是因为map是有序容器,按照关键字排序,实际中mp中元素索引顺序是{“a”,1},{“b”,2},{“d”,4}

2 索引/遍历map

map中的元素其实是pair类型。pair是用来生成特定类型的模板,他的格式是pair<T1,T2>,需要给它提供两个模板类型。每一个pair对象都是map中的一个键值对。

pair类型有first,second两个成员,分别表示pair中第一个和第二个值,也就对应关键字-值。

1
2
3
pair<string,int> pr1("egg",1);
pair<string,int> pr2 = {"dog",1};
make_pair("apple",1);//返回与参数类型相对应的pair元素

** ******** 下面介绍元素的遍历 ********** **

1
2
3
4
5
6
7
8
9
10
11
// 用for循环遍历
map<string, int> mp = { {"a",1},{"d",4}, {"b",2} };
for (const auto &w : mp) {
cout << w.first << " " << w.second << endl;
}
// 用迭代器遍历
auto map_it = mp.begin();
// map<string, int>::iterator map_it = mp.begin();
while (map_it != mp.cend()) {
cout << map_it->first << "-" << map_it->second << " ";
map_it++;

output:

1
a-1 b-2 d-4
3 插入元素
1
2
3
4
	mp.insert(pair<string, int>("c", 3));
mp.insert(make_pair("e", 5));
//也可以简单粗暴的方法
mp["f"] = 6;

注意:

通过insert函数插入元素时,如果新插入的元素的关键字在map中已经有了,那么不会插入。比如上边再执行mp.insert(make_pair("e",10));map中”e”关键字的值还是5.

但是通过mp["e"] = 10;这种方法插入e的值改为10

set

1
2
3
4
5
6
7
set<int> s = { 1,3,12,45,23,5 };
set<int>::iterator set_it = s.cbegin();
while (set_it != s.cend()) {
cout << *set_it << " ";
set_it++;
}
cout << endl;

output:

1
2
1 3 5 12 23 45
//输出按照大小排序

对于关联容器的其他操作,比如insert,find,erase,size,empty等见CPLUSPLUS网站

CPLUSPLUC


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!