STL-----map的常见使用

1,MAP的说明

Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据 处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道。这里说下map内部数据的组织,map内部自建一颗红黑树(一 种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的。

map是一类关联式容器。它的特点是增加和删除节点对迭代器的影响很小,除了那个操作节点,对其他的节点都没有什么影响。

对于迭代器来说,可以修改实值,而不能修改key。

2、map的功能

自动建立Key - value的对应。key 和 value可以是任意你需要的类型。

注意: key不可以修改但是value的值可以修改复杂度基本是Log(N),

根据Key 修改value,但是不可以改变key的值

3,map的定义

可以想定义变量一样定义map

map<key,value>变量名

这里的key和value可以使下列的任意组合 int char struct string

map<int,char> name;
map<char,int> name;
map<int,int> name;
map<string,char> name;
map<string,int> name;

简单的使用:

#include <map>  //这个是头文件不能少的
#include <iostream>
using namespace std;
int main()
{
    map<char, int> name;
    name['a'] = 1001;
    map<string, int>name1;
    name1["hhh"] = 1002;
    cout << "key是a的value是" << name['a'] << endl;
    cout << "key是hhh的value是" << name1["hhh"] << endl;
    return 0;
}
key是a的value是1001
key是hhh的value是1002

4,常见的用法

insert()

插入元素

size()

计算元素的个数

empty()

判断是否为空

find()

查找一个元素

erase()

删除元素

clear()

清空元素

5举例说明

5.1输入数据

1-最原始的添加元素,

#include <map>
#include <iostream>
using namespace std;
int main()
{
    map<char, int> name;
    name['a'] = 1001;
    name['b'] = 1002;
    name['c'] = 1003;
    name['d'] = 1004;

    cout << "key是a的value是" << name['a'] << endl;
    cout << "key是a的value是" << name['b'] << endl;
    cout << "key是a的value是" << name['c'] << endl;
    
    return 0;
}
输出:
key是a的value是1001
key是a的value是1002
key是a的value是1003

2-那么还可以插入一个元素

#include <map>
#include <string>
#include <iostream>
using namespace std;
int main()
{
    map<char, int> name;
    name['a'] = 1001;
    name['b'] = 1002;

    name.insert(pair<char, int>('t', 1222)); //这里是使用的是插入

    cout << "key是a的value是" << name['a'] << endl;
    cout << "key是a的value是" << name['b'] << endl;
    cout << "key是a的value是" << name['t'] << endl;
    
    return 0;
}

输出为:

key是a的value是1001
key是a的value是1002
key是a的value是1222

3-加一个循环条件来控制无限的来添加到map之中

#include <map>
#include<iostream>
using namespace std;
int main()
{
    string name;
    int telp=1;
    map<string, int> xx;
    while (telp != 0) {
        cin >> name >> telp;
        xx[name] = telp;
    }
    cout << "输出:" << endl;
    for (map<string, int>::iterator it = xx.begin(); it != xx.end(); it++) {
        cout << it->first << " " << it->second << endl;
    }
    return 0;
}

输出为:

张三 1523333
李四 2121212
汪汪 32323232
大角度看 0
输出:
大角度看 0
李四 2121212
汪汪 32323232
张三 1523333

5.2size的使用

#include <map>
#include <string>
#include <iostream>
using namespace std;
int main()
{
    map<char, int> name;
    name['a'] = 1001;
    name['b'] = 1002;
    name['c'] = 1003;
    name['d'] = 1004;
    cout <<"长度是:"<< name.size() << endl;

    return 0;
}

输出:

长度是:4

5.3删除的使用

#include <map>
#include <string>
#include <iostream>
using namespace std;
int main()
{
    map<char, int> name;
    name['a'] = 1001;
    name['b'] = 1002;
    name['c'] = 1003;
    name['d'] = 1004;
    cout << "size = " << name.size() << endl;
    //1. 使用 key 删除
    name.erase('a');  // 删除 key = 123456 的节点
    cout << "size = " << name.size() << endl;
    //2. 使用迭代器删除
    map<char, int>::iterator iter = name.find('b');
    name.erase(iter);
    cout << "size = " << name.size() << endl;
    //3. 清空整个容器
    name.clear();
    cout << "size = " << name.size() << endl;
    return 0;
}

输出:

size = 4
size = 3
size = 2
size = 0

5.4来进行数据的修改, 我们知道了那个key的值不可以动,但是value的值可以修改,就是可以重新赋值,然后将其覆盖掉,举例

#include <map>
#include <string>
#include <iostream>
using namespace std;
int main()
{
    map<char, int> name;
    name['a'] = 1001;
    cout << "key是a的value的初始值是" << name['a'] << endl;
    name['a'] = 2222;
    cout << "覆盖新值是" << name['a'] << endl;
    name['a'] = 3333;
    cout << "覆盖新值是" << name['a'] << endl;
    name['a'] = 4444;
    cout << "覆盖新值是" << name['a'] << endl; 

    return 0;
}

输出:

key是a的value的初始值是1001
覆盖新值是2222
覆盖新值是3333
覆盖新值是4444

5.5 find 的使用

#include<map>   // map
#include<iostream>
using namespace std;
int main()
{
    map<char, int>maps;
    maps['d'] = 10;
    maps['e'] = 20;
    maps['a'] = 30;
    maps['b'] = 40;
    maps['c'] = 50;
    maps['r'] = 60;
    cout << "删除前:" << endl;
  //使用迭代来将数据都输出
    for (map<char, int>::iterator it = maps.begin(); it != maps.end(); it++)
    {
        cout << it->first << " " << it->second << endl;
    }

    //输出查找的值
   map<char,int>::iterator its = maps.find('c');
   cout << its->second;
   
    return 0;
}

输出:

删除前:
a 30
b 40
c 50
d 10
e 20
r 60
50

在迭代的输出过程中想要输出key和value则使用迭代,然后指针输出分别指向first,second来进行输出

find和erase的共同使用

定向删除,先去找,然后再去删除

#include<map>   // map
#include<iostream>
using namespace std;
int main()
{
    char t;
    map<char, int>maps;
    maps['d'] = 10;
    maps['e'] = 20;
    maps['a'] = 30;
    maps['b'] = 40;
    maps['c'] = 50;
    maps['r'] = 60;
    cout << "你想删除的是:"; cin >> t;
    cout << "删除前:" << endl;
    for (map<char, int>::iterator it = maps.begin(); it != maps.end(); it++)
    {
        cout << it->first << " " << it->second << endl;
    }

    maps.erase(maps.find(t));

    cout << "删除后:" << endl;
    for (map<char, int>::iterator it = maps.begin(); it != maps.end(); it++)
    {
        cout << it->first << " " << it->second << endl;
    }

    return 0;
}

输出:

你想删除的是:d
删除前:
a 30
b 40
c 50
d 10
e 20
r 60
删除后:
a 30
b 40
c 50
e 20
r 60

引用文本

若有问题请指出,共同

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

i-阿松!

请给我一毛钱

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值