C++ 之stl容器 map 用法整理

绝地灬酷狼 2024-04-19 06:16 132阅读 0赞

1. map 简介

map是STL的一个关联容器,它提供一种以键-值(key-value)一对一存储的数据类型hash。

原型:

  1. typedef pair<const Key, T> value_type;

map以模板(泛型)方式实现,可以存储任意类型的数据,包括使用者自定义的数据类型。Map主要用于资料一对一映射(one-to-one)的情況,map內部的实现自建一颗红黑树,这颗树具有对数据自动排序的功能。在map内部所有的数据都是有序的,后边我们会见识到有序的好处。比如一个班级中,每个学生的学号跟他的姓名就存在著一对一映射的关系。

2. map对象的定义和初始化

  • map m;
  • map m(m2)
  • map m(b, e);

上述第一种方法定义了一个名为m的空的map对象;第二种方法创建了m2的副本m;第三种方法创建了map对象m,并且存储迭代器b和e范围内的所有元素的副本。

map的value_type是存储元素的键以及值的pair类型,键为const。

3. map的基本操作

3.1 插入数据

  • 使用下标;
  • 使用insert函数插入pair
  • 使用insert函数插入value_type 数据
  1. // 定义一个map对象
  2. map<int, string> mapStudent;
  3. // 第一种 用insert函數插入pair
  4. mapStudent.insert(pair<int, string>(000, "student_zero"));
  5. // 第二种 用insert函数插入value_type数据
  6. mapStudent.insert(map<int, string>::value_type(001, "student_one"));
  7. // 第三种 用"array"方式插入
  8. mapStudent[123] = "student_first";
  9. mapStudent[456] = "student_second";

以上三种用法,虽然都可以实现数据的插入,但是它们是有区别的,当然了第一种和第二种在效果上是完成一样的,用insert函数插入数据,在数据的 插入上涉及到集合的唯一性这个概念,即当map中有这个关键字时,insert操作是不能在插入数据的,但是用数组方式就不同了,它可以覆盖以前该关键字对 应的值,例如:

  1. mapStudent.insert(map<int, string>::value_type (001, "student_one"));
  2. mapStudent.insert(map<int, string>::value_type (001, "student_two"));

上面这两条语句执行后,map中001这个关键字对应的值是“student_one”,第二条语句并没有生效,那么这就涉及到我们怎么知道insert语句是否插入成功的问题了,可以用pair来获得是否插入成功,如:

  1. // 构造定义,返回一个pair对象
  2. pair<iterator,bool> insert (const value_type& val);
  3. pair<map<int, string>::iterator, bool> Insert_Pair;
  4. Insert_Pair = mapStudent.insert(map<int, string>::value_type (001, "student_one"));
  5. if(!Insert_Pair.second)
  6. cout << ""Error insert new element" << endl;

我们通过pair的第二个变量来知道是否插入成功,它的第一个变量返回的是一个map的迭代器,如果插入成功的话Insert_Pair.second应该是true的,否则为false。

3.2 map中数据的查找和读取

上述采用下标的方法读取map中元素时,若map中不存在该元素,则会在map中插入。

因此,若只是查找该元素是否存在,可以使用函数count(k),该函数返回的是k出现的次数;若是想取得key对应的值,可以使用函数find(),该函数返回指向该元素的迭代器。

  1. #include <stdio.h>
  2. #include <map>
  3. using namespace std;
  4. int main(){
  5. map<int, int> mp;
  6. for (int i = 0; i < 20; i++){
  7. mp.insert(make_pair(i, i));
  8. }
  9. if (mp.count(0)){
  10. printf("yes!\n");
  11. }else{
  12. printf("no!\n");
  13. }
  14. map<int, int>::iterator it_find;
  15. it_find = mp.find(0);
  16. if (it_find != mp.end()){
  17. it_find->second = 20;
  18. }else{
  19. printf("no!\n");
  20. }
  21. map<int, int>::iterator it;
  22. for (it = mp.begin(); it != mp.end(); it++){
  23. printf("%d->%d\n", it->first, it->second);
  24. }
  25. return 0;
  26. }

3.3 从map中删除和清空数据

从map中删除元素函数为erase,该函数有三种形式:

  • m.erase(k);
  • m.erase(it);
  • m.erase(b,e);

第一种方法删除的是m中键为k的元素,返回的是删除的元素的个数;第二种方法删除的是迭代器it指向的元素,返回的是void;第三种方法删除的是迭代器b和迭代器e范围内的元素,返回void。

  1. //迭代器刪除
  2. iter = mapStudent.find("123");
  3. mapStudent.erase(iter);
  4. //用关键字刪除
  5. int n = mapStudent.erase("123"); //如果刪除了會返回1,否則返回0
  6. //用迭代器范围刪除 : 把整个map清空
  7. mapStudent.erase(mapStudent.begin(), mapStudent.end());
  8. //等同于mapStudent.clear()

3.4 map的大小

  1. int nSize = mapStudent.size();

4. map 的基本操作函数罗列

  1. begin() //返回指向map头部的迭代器
  2. clear() //删除所有元素
  3. count() //返回指定元素出现的次数
  4. empty() // 如果map为空则返回true
  5. end() //返回指向map末尾的迭代器
  6. equal_range() //返回特殊条目的迭代器对
  7. erase() //删除一个元素
  8. find() //查找一个元素
  9. get_allocator() //返回map的配置器
  10. insert() // 插入元素
  11. key_comp() // 返回比较元素key的函数
  12. lower_bound() //返回键值>=给定元素的第一个位置
  13. max_size() //返回可以容纳的最大元素个数
  14. rbegin() //返回一个指向map尾部的逆向迭代器
  15. rend() // 返回一个指向map头部的逆向迭代器
  16. size() //返回map中元素的个数
  17. swap() //交换两个map
  18. upper_bound() //返回键值>给定元素的第一个位置
  19. value_comp() //返回比较元素value的函数

参考链接:

C++ map用法总结(整理)

c++中map的用法详解

http://www.cplusplus.com/reference/map/map/

发表评论

表情:
评论列表 (有 0 条评论,132人围观)

还没有评论,来说两句吧...

相关阅读