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
引用文本
若有问题请指出,共同