基本的框架:

语法/概念

说明

map<K, V>

关联容器,存储键值对,键唯一且自动按升序排序(默认)。

map::iterator

用于遍历map的迭代器,指向键值对pair<K, V>。

iter->first

迭代器指向的键值对中的‌键(key)‌。

iter->second

迭代器指向的键值对中的‌值(value)‌。

begin()/end()

容器的起始和结束迭代器,构成遍历的完整范围(左闭右开区间[begin, end))。

find:

用于查找一个元素是否存在
map<string,string>::iterator it;
it = dataMap.find(key);
if(it != dataMap.end()) { 
    string valueStr = it->second;
}

插入数据:

 map插入数据的方法不止一种,下面代码中的几种方式都可以用来插入数据:
my_Map["a"]=1; // 最常用的方法
my_Map.insert(map<string,int>::value_type("b",2)); 
my_Map.insert(pair<string,int>("c",3));
my_Map.insert(make_pair<string,int>("d",4));
在使用数组直接访问插入数据时, 可以覆盖之前已经插入的数据, 但是使用 insert 是无法多次插入的。

map的遍历

map的遍历主要是使用迭代器, 我们来看一个例子:
// 迭代器
#include <bits/stdc++.h>
using namespace std;
int main() {
    map<int, string> mapStudent;
    mapStudent[1] = "student_one";
    mapStudent[2] = "student_two";
    mapStudent[3] = "student_three";
    map<int, string>::iterator iter;
    for (iter = mapStudent.begin(); iter != mapStudent.end(); iter++) {
        cout << iter->first << "" << iter->second << endl;
    }
}
//map::iterator it; 定义一个迭代指针it。
//it->first 为索引键值,it->second 为值。

这里 mapStudent.begin() ,返回的是  mapStudent 第一个元素,而 mapStudent.end()  ,返回的并不是  mapStudent 最后一个元素,而是  mapStudent 最后一个元素后面的地址。可以理解为每个 map 都有一个结束的标识,而  mapStudent.end()  返回的就是这个位置,因此在  for 循环中,用  

iter != mapStudent.end()

来判断是否循环到了最后,并且等于  mapStudent.end()  时循环是不被执行的。

更加简洁的声明方法:
#include <bits/stdc++.h>
using namespace std;
int main() {
    map<int, string> mapStudent;
    mapStudent[1] = "student_one";
    mapStudent[2] = "student_two";
    mapStudent[3] = "student_three";
	auto iter = mapStudent.begin();  // 简洁的auto声明
	for(; iter != mapStudent.end(); iter++) {
    cout << iter->first << " " << iter->second << endl;
	}
}
下面的其实一样,只是合并了:
#include <bits/stdc++.h>
using namespace std;
int main() {
    map<int, string> mapStudent;
    mapStudent[1] = "student_one";
    mapStudent[2] = "student_two";
    mapStudent[3] = "student_three";
	// 简洁的auto声明
	for(auto iter = mapStudent.begin(); iter != mapStudent.end(); iter++) {
    cout << iter->first << " " << iter->second << endl;
	}
}//这样子也是可以的

用途一样,但是遍历 map 容器的迭代器声明方法更简便,容易懂。

倒序输出(遍历)

上面都是正序遍历(从小到大),这里给一段从大到小遍历的例子:

#include<bits/stdc++.h>
using namespace std;
int main() {
    // 修改此处:添加greater<int>作为第三个模板参数
    map<int, string, greater<int>> mapStudent;
    mapStudent[1] = "student_one";
    mapStudent[2] = "student_two";
    mapStudent[3] = "student_three";
    // 使用auto迭代器声明进行遍历
    for(auto iter = mapStudent.begin(); iter != mapStudent.end(); iter++) {
        cout << iter->first << " " << iter->second << endl;
    }
    return 0;
}

//输出编号顺序为 3->2->1。

差异:添加 greater<int> 作为第三个模板参数,删掉 greater<int> 后,即可变为正序遍历。

名字和编号的对应关系‌在实际应用中(举例):

编号通常作为‌键‌(唯一标识)
名字通常作为‌值‌(具体信息)

其它用法

my_Map.size()       //返回元素数目 
my_Map.empty()      //判断是否为空 
my_Map.clear()      //清空所有元素

更多推荐