关联容器map
来源:互联网 发布:化合物数据库 编辑:程序博客网 时间:2024/06/05 19:14
关联容器map
- map: 是一个 key-value 键值对的集合,可以把它理解为关联数组,把 key理解为数组的下标,通过key获得值。
例如:
#include <map> //需要包含该头文件
//是一个 key-value 键值对的集合,可以把它理解为关联数组,把 key理解为数组的下标,通过key获得值 map<int, string> m1; //key 1,2,3 把key理解为索引 m1[1] = "hello"; m1[2] = "tom"; m1[3] = "haha";
map的定义
map<string, string> m; //定义一个空map map<string, string> m2(m); //定义一个map的副本 map<string, string> m3(m.begin(), m.end()); //通过迭代器定义
map定义的类型
map<int, string> m1; m1[1] = "hello"; m1[2] = "tom"; m1[3] = "haha"; map<int, string>::value_type p = *m1.begin(); //pair类型 map<int, string>::key_type k = p.first; //键的类型 map<int, string>::mapped_type v = p.second; //值的类型 cout<<k<<endl; //输出为:1 cout<<v<<endl; //输出为:hello
map的遍历
方法一:
for(auto e:m1){ cout<< e.first << " "<<e.second<<endl; }
方法二:使用迭代器
map<int, string>::iterator it = m1.begin(); while (it!=m1.end()) { cout<<it->first<<" "<<it->second<<endl; it++; }
map的添加
map<int, string> m1; m1.insert(make_pair(1, "hello")); m1.insert(make_pair(2, "tom")); m1.insert(make_pair(3, "haha")); m1.insert(make_pair(3, "heheehe")); //注意:该语句失效,因为key值要唯一,当已经有一个对应的key时,再次insert是无效的。
map的删除
m1.erase(m1.begin());
map的应用
- 在机试中,其功能为:将一个类型的变量映射至另一类型。
例如:
产生冠军
思路:
- 将选手对应结点,胜负关系对应为结点之间的有向边,可以产生冠军的情况即为全图中入度为零的点唯一。
- 与普通的拓扑排序问题不同,这里我们需要将输入的选手姓名映射为结点编号,这就需要标准对象map。
#include <stdio.h>#include <map>#include <string>using namespace std;int in[2002]; //类似于hash,把各个名字对应的入度保存在in数组内;但是姓名无法用来当做下表索引,所以使用 map<string, int>来把string向int转换,从而可以通过int型对in数组置相应的入度。int main(int argc, const char * argv[]) { int n; while (scanf("%d", &n)!=EOF&&n!=0) { for (int i=0; i<2*n; i++) { in[i] = 0; //初始化入度,一定要初始化,不然报错 } map<string, int> m; m.clear(); int it=0; for (int i=0; i<n; i++) { char str1[50], str2[50]; scanf("%s%s", str1, str2); string a = str1; string b = str2; //string不能使用scanf输入,所以先用char[]输入,然后再赋值给string if (m.find(a)==m.end()) { //若map中尚无该a的映射 m[a] = it++; //设定其映射为it,并递增it } if (m.find(b)==m.end()) { //若map中尚无b的映射 m[b] = it++; //设定其映射为it,并递增it } int t = m[b]; in[t]++; //将b对应的in数组入度加一 } int ans = 0; for (int i=0; i<it; i++) { //确定所有影射数字的入度,统计入度为0的个数 if (in[i]==0) { ans++; } } if (ans==1) { //若入度为0的点的个数为1,则输出yes,否则输出no puts("Yes"); } else puts("No"); } return 0;}
以上map的用法:
map<string, int> M; //定义一个完成从string到int映射的map M.clear(); //清空一个map M.find(b); //确定map中是否保存string对象b的映射,若没有函数返回M.end() M[b] = it; //若map中不存在string对象b的映射,则定义其为it; t = M[b]; //若map中存在string对象的映射,则读出该映射
另外一个在全排列中使用map的例子:
回溯法解全排列
0 0
- STL::map关联容器
- C++ 关联容器 map
- 关联容器Map
- ACE 关联容器 MAP
- C++MAP关联容器
- 初识关联容器 map
- 关联容器之map
- 关联容器 map
- 关联容器 map
- 关联容器map set
- 关联容器 Map
- 使用map关联容器
- map关联容器
- map关联容器
- C++map关联容器
- 关联式容器-map
- map关联容器
- 关联容器map
- 基于机器学习方法通过BBC新闻头条进行道琼斯指数DJIA的预测
- 排序--堆排序
- 简单使用Git和Github来管理自己的代码和读书笔记
- java中的关键字package和import
- poj-Til the Cows Come Home(Bellman-Ford)
- 关联容器map
- two sum
- Install Apache2.4 & PHP7 &Mariadb In Fedora25
- Day1 基础知识
- socket返回SOCKET_ERROR但是errno为0
- ios 切换根视图
- android 通过MediaRecorder实现简单的录音
- 第二届c校赛-8-上三角
- (C51学习四)外部中断和定时器中断