map容器核心概念总结(入门)(以后会再补充)
·
基本的框架:
|
语法/概念 |
说明 |
|---|---|
|
|
关联容器,存储键值对,键唯一且自动按升序排序(默认)。 |
|
|
用于遍历map的迭代器,指向键值对 |
|
|
迭代器指向的键值对中的键(key)。 |
|
|
迭代器指向的键值对中的值(value)。 |
|
|
容器的起始和结束迭代器,构成遍历的完整范围(左闭右开区间 |
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() //清空所有元素
更多推荐


所有评论(0)