C++ STL map(映射表) 关联式容器

一、map的特性

1.map中的所有元素都是pair。

2.pair中有两个元素,第一元素为键值(key),第二元素为实值(value)。

3.map中的所有元素会根据键值自动排序。

4.map中的元素不允许拥有相同的键值。

5.不可以通过map 的迭代器来改变map 的键值。map的键值关系到map的元素的排列规则,任意改变map元素键值将严重破坏map的组织。

6.可以通过迭代器来修改元素的实值。

 

二、本质

1.map的底层机制红黑树(每个节点的内容是一个pair),有着不错的自动排序效果,查找的效率 O(log2n)

2.由于map所开放的操作接口,RB-Tree也都提供了,所以几乎所有的map操作行为,都只是调用RB-Tree的操作行为而已。

图1

如图1所示,begin()是RB-Tree的最左侧节点,end()是RB-Tree的最右侧节点。

三、map的使用及操作函数示例

#include <iostream>
#include <map>    //使用map所需的头文件
#include <algorithm>    //算法头文件
using namespace std;

void PrintMap(pair<char,int> pr)
{
    //first为键值,second为实值
    cout << pr.first << " " << pr.second << endl;
}

int main()
{
    map<char,int> mp;    //定义一个键值为char, 实值为int的 mp 对象
    
    //先向 map 中添加 6 个 pair 元素
    mp['A'] = 10;
    mp['B'] = 20;
    mp['C'] = 30;
    mp['D'] = 40;
    mp['E'] = 50;
    mp['F'] = 60;
   
    map<char,int>::iterator ite = mp.begin(); //beigin(),返回map中首元素的迭代器
    //第一种 遍历打印 map 的方式
    while(ite != mp.end())    //end()返回map中尾元素的下一个元素的迭代器
    {
        cout << ite->first << " " << ite->second << endl;
        ++ite;
    }

    //第二种 使用 for_each 函数打印 map
    ::for_each(mp.begin(),mp.end(),&PrintMap);
    
    //返回键值为 'C' 的迭代器
    map<char,int>::iterator itePos = mp.find('C');    //find 返回相应的指定键值的迭代器

    //删除键值为 'C' 的键值对
    mp.erase(itePos);    //erase 删除指定位置上的 map 元素

    //插入新的键值对
    pair<char,int> pr('C',70);
    mp.insert(pr);    //inert 向 map 中插入键值对

    //count 判断该键值的 map 元素是否存在
    cout << mp.count('C') << endl;    //count 存在返回1,不存在返回0

    //返回该键值或者大于该键值的 map 的迭代器
    itePos = mp.lower_bound('A');
    cout << itePos->first << " " << itePos->second << endl;
    
    //返回大于该键值的 map 的迭代器
    itePos = mp.upper_bound('A');
    cout << itePos->first << " " << itePos->second << endl;
    
    //返回 map 中的元素的个数
    cout << mp.size() << endl;

    //empty 判断map是否为空 为空返回true,否则返回false
    cout << mp.empty() << endl;   

    map <char,int> mp2;
    mp2['G'] = 80;
    //swap 交换 两个map的所有元素
    mp.swap(mp2);

    //clear 清除map中的所有元素
    mp.clear(); 


    system("pause");
    return 0;
}

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值