C++ 学习——STL之map介绍

转载自:https://blog.csdn.net/liitdar/article/details/80009712

本文主要介绍map的概念及用法。

1. 概念

map是STL的一个关联容器,它提供一对一的数据处理能力。

map对象是模板类,需要关键字和存储对象两个模板参数,其中第一个参数称为关键字,每个关键字只能在map中出现一次;第二个参数称为该关键字的值,可理解为“{键,值}对”。例如,学生的“学号”与“姓名”就可以用map进行描述,“学号”对应“关键字”,“姓名”对应“值”,具体的map描述如下:

std::map<int, string> mapStudent;
   
   

map内部数据的组织:map内部自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的。

上面语句定义了一个用int作为索引(关键字),并拥有相关联的指向string的指针。为了使用方便,我们可以对模板类使用typedef进行下面的类型定义:


   
   
  1. typedef map< int, string> mapStudent_t;
  2. mapStudent_t mapStudent;

2. 常见用法

2.1 map构造函数

map提供了几种构造函数,通常我们采用下面的方式构造map:


   
   
  1. typedef map< int, string> mapStudent_t;
  2. mapStudent_t mapStudent;

2.2 map的数据插入操作

对于数据插入操作,map也提供了多种方法,常见的插入操作方式如下:


   
   
  1. mapStudent.insert(pair< int, string>( 1, "zhao"));
  2. mapStudent.insert(pair< int, string>( 2, "qian"));
  3. mapStudent.insert(pair< int, string>( 3, "sun"));

2.3 map中数据的遍历

我们可以通过使用map的迭代器iterator、调用map对象的begin()和end()函数,实现对于map中数据的遍历,如下:


   
   
  1. // 遍历
  2. cout << "content of map as followed: " << endl;
  3. mapStudent_t::iterator iter;
  4. for (iter = mapStudent.begin(); iter != mapStudent.end(); iter++)
  5. {
  6.     cout << iter->first << " " << iter->second << endl;
  7. }

说明:

1)begin()和end()两个成员函数,分别代表map对象中第一个数据条目和最后一个数据条目,这两个数据条目的类型是iterator;

2)通过map对象的方法获取的iterator数据类型是一个std::pair对象,iterator数据类型包括下面的两个数据:

  • iterator->first 关键字(key)
  • iterator->second 存储的数据(value)

2.4 map中数据的查找

我们可以通过使用map的迭代器iterator、调用find函数(传入的参数为要查找的key),来查找定位map中的指定数据,如下:


   
   
  1. // 查找
  2. iter = mapStudent.find( 2);
  3. if (iter != mapStudent.end())
  4. {
  5. cout << "Find it, the relative value is: " << iter->second << endl;
  6. }
  7. else
  8. {
  9. cout << "Can not find the relative value." << endl;
  10. }

说明:find函数的入参为map结构的key,并且入参必须完全匹配map的key时,才能找到对应的value。例如,有以下map结构:

mapStudent.insert(pair<string, string>("zhao", "zhaoyun"));
   
   
如果要查找该map的value,必须在find函数中输入完整的key作为入参、即“zhao”才行,如果输入的入参为“zh”、或“zha”,则都不能找到该map的value。

2.5 map中数据的删除

对于map中数据的删除,可以分为如下两种情况:

a)如果想要清空map中的所有数据,可以使用clear函数;

b)如果想要删除map中的指定数据,可以通过使用map的迭代器iterator、调用erase函数来实现,如下:


   
   
  1. // 删除
  2. iter = mapStudent.find( 3);
  3. mapStudent.erase(iter);

2.6 map中数据的排序

map中的所有元素都会根据元素的键值,自动进行升序排序。

3. 示例程序


   
   
  1. #include <iostream>
  2. #include <map>
  3. #include <string>
  4. using namespace std;
  5. int main()
  6. {
  7.     typedef std:: map< int, string> mapStudent_t;
  8.     mapStudent_t mapStudent;
  9.     mapStudent.insert(pair< int, string>( 1, "zhao"));
  10.     mapStudent.insert(pair< int, string>( 2, "qian"));
  11.     mapStudent.insert(pair< int, string>( 3, "sun"));
  12.     // 遍历
  13.     cout << "content of map as followed: " << endl;
  14.     mapStudent_t::iterator iter;
  15.     for (iter = mapStudent.begin(); iter != mapStudent.end(); iter++)
  16.     {
  17.         cout << iter->first << " " << iter->second << endl;
  18.     }
  19.     // 查找
  20.     iter = mapStudent.find( 2);
  21.     if (iter != mapStudent.end())
  22.     {
  23.         cout << "Find it, the relative value is: " << iter->second << endl;
  24.     }
  25.     else
  26.     {
  27.         cout << "Can not find the relative value." << endl;
  28.     }
  29.     // 删除
  30.     iter = mapStudent.find( 3);
  31.     mapStudent.erase(iter);
  32.     // 再次遍历,观察删除操作是否成功
  33.     cout << "after delete, content of map as followed: " << endl;
  34.     for (iter = mapStudent.begin(); iter != mapStudent.end(); iter++)
  35.     {
  36.         cout << iter->first << " " << iter->second << endl;
  37.     }
  38.     
  39.     return 0;
  40. }

上述代码运行结果如下:


猜你喜欢

转载自blog.csdn.net/qq_33195791/article/details/81673335