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

本文详细介绍了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. }

上述代码运行结果如下:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值