map<string,int>和map<char *,int>有什么区别?部分转自: https://bbs.csdn.net/topics/270020481
map 排序部分 转自: https://www.cnblogs.com/eilearn/p/9473804.html
摘自百度百科
1,定义:Map是STL 的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,
由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道。
2,这里说下map内部数据的组织,map内部自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,
3,map的构造函数
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<vector> #include<map> using namespace std; int main(void) { vector<char> a{ 'B', 'C' }; vector<char> b{ 'A', 'C', 'D' }; vector<char> c{ 'A', 'B', 'D','E' }; vector<char> d{ 'B', 'C', 'E','F' }; vector<char> e{ 'C', 'D' }; vector<char> f{ 'D' }; map <char, vector<char>> m { { 'A',a },{ 'B',b },{ 'C',c },{ 'D',d },{ 'E',e },{ 'F',f } }; system("pause"); return 0; }
如上构造一个名叫 m 的 map ,其中使用 char 映射 vector char类型的 数组
4,数据的插入
①插入 pair 类型的数据
map<int, char>m;
m.insert((pair<int, char>(1, 'A')));
当 map 已经存在某个值时,就无法再插入
②用数组方式插入数据
map<char, int>m;
m['A'] = 1;
会覆盖重复的数据
5,
m.size() 大小
m.count 返回的是被查找元素的个数。map中不存在相同元素,所以返回值只能是1或0。可以用这个知道有无出现,但不知道位置 出现为 1,不出现为 0
m.find() 同 vector
lower_bound 返回下界的迭代器
upper_bound 返回上界的迭代器
m.empty()
m.clear()
m.erase(1) 删除 1 ,成功返回 1 ,失败返回 0
6,当以char *做key时,stl中默认是以字符串为key还是以地址为key?
我试时,看到是用地址。
很明显的道理,不要简单从字面上的东西去理解,虽然char*可以指向字符串,但它毕竟只是一个指针,指针存放的内容只能是地址,请谨记。
而string是一个对象,当传递一个常量字符串(例如"abc")进来时,可以通过string的构造函数自动将该常量字符串转换为一个string对象。
如果把该常量字符串赋值给char*类型,就如同char* p = "abc"; 这个时候p只是一个指向"abc"的首地址的指针而已。
7,map 的排序
参数:map<key,value>
① 按 key 升序:第三个参数 是用于函数比较的,没有的话默认 按 key 升序
② 按 key 降序:map<key,value,greater<key的类型> >
③ 按 key 的长度排序,写一个比较函数
struct CmpByKeyLength { bool operator()(const string& k1, const string& k2)const { return k1.length() < k2.length(); } };
④:如果想要按照 value 升降序的话 需要将 map 移到 vector,在用 sort 排序
#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) { //1、map这里指定less作为其默认比较函数(对象),就是默认按键值升序排列 map<string, int> m; m["LiMin"] = 90; m["ZiLinMi"] = 79; m["BoB"] = 92; m.insert(make_pair("Bing", 99)); m.insert(make_pair("Albert", 86)); //输出添加的内容 map<string, int>::iterator iter; for (iter = m.begin(); iter !=m.end(); ++iter) { cout << (*iter).first << ' ' << (*iter).second << endl; } cout << endl; // 将map中的内容转存到vector中 vector<P> v(m.begin(), m.end()); //对线性的vector进行排序 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; }
========= ========= ========= ====== ====== ===== ==== === == =
锦瑟 李商隐 唐
沧海月明珠有泪,蓝田日暖玉生烟。
此情可待成追忆?只是当时已惘然。