STL — map

参考:

https://baike.baidu.com/item/Map/5808503?fr=aladdin

https://bbs.csdn.net/topics/270020481( map<string,int>和map<char *,int>有什么区别?)

https://www.cnblogs.com/eilearn/p/9473804.html(map 排序)

 

 

一,概述:

1,定义

  Map 是 STL 的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力。

2,功能

  由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道。

3,map 内部数据的组织

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

 

二,map 的使用

1,map 的构造函数

  map<int, string> maphai;
  map<char, int> maphai;
  map<string, char> mapstring;
  map<string, int> mapstring;
  map<int, char>mapint;
  map<char, string>mapchar;

2,数据的插入

  ① 插入 pair 类型的数据。当 map 已经存在某个值时,就无法再插入

    map<int, char>m;
    m.insert((pair<int, char>(1, 'A'))); 

  ② 用数组方式插入数据,会覆盖重复的数据

    map<char, int>m;
     m['A'] = 1;

3,常见函数

  m.size()   大小

  m.count   返回的是被查找元素的个数。map中不存在相同元素,所以返回值只能是1或0。可以用这个知道有无出现,但不知道位置    出现为 1,不出现为 0

  m.find()    同 vector

  m.empty()

  m.clear()

  lower_bound   返回下界的迭代器

  upper_bound   返回上界的迭代器

  m.erase(1)   删除 1 ,成功返回 1 ,失败返回 0 

 

4,当以 char* 做 key 时,STL 中默认是以字符串为 key 还是以地址为 key?

 <char*, int> 是以地址为 key,<string, int> 是以 string 为 key。

 

5,map 的排序

参数:map<key, value>  

① 按 key 升序:第三个参数是用于函数比较的,没有的话默认 less,即按 key 升序

② 按 key 降序:map<key, value, greater<key的类型> >  

③ 如果想要按照 value 升降序的话,可以将 map 移到 vector,再用 sort 排序

 

6,示例

#define _CRT_SECURE_NO__WARNINGS
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include <vector>
#include<string>
#include<map>
#include <functional>
using namespace std;
typedef pair<string, int> P;
bool cmp(const P& a, const P& b)
{
    return a.second < b.second;
}
int main(void)
{
    // 创建
    map<string, int> m;

    // 插入数据
    m["NaNa"] = 99;
    m["LuNa"] = 66;
    m.insert(make_pair("Michael", 44));
    m.insert(make_pair("Jack", 88));

    // 遍历
    for (auto i = m.begin(); i != m.end(); i++)
        cout << (*i).first << ' ' << (*i).second << endl;
    cout << endl;

    // 将 map 中的内容转存到 vector 中,并排序
    vector<pair<string, int>> v(m.begin(), m.end());
    sort(v.begin(), v.end(), cmp);

    // 遍历
    for (int i = 0; i < v.size(); i++)
        cout << v[i].first << ' ' << v[i].second << endl;

    system("pause");
    return 0;
}
View Code

 

 

========= ========= ========= ====== ====== ===== ==== === == =

  锦瑟  李商隐 唐

锦瑟无端五十弦,一弦一柱思华年。
庄生晓梦迷蝴蝶,望帝春心托杜鹃。
沧海月明珠有泪,蓝田日暖玉生烟。
此情可待成追忆?只是当时已惘然。 

 

posted @ 2020-03-06 18:59  叫我妖道  阅读(205)  评论(0编辑  收藏  举报
~~加载中~~