c++ map/multimap容器 学习笔记
1 map的基本概念
简介:
map中所有的元素都是pair
pair中第一个元素是key(键),第二个元素是value(值)
所有元素都会根据元素的键值自动排序。
本质:
map/multimap 属于关联式容器,底层是用红黑树实现。
优点:
可以根据key值快速查找数据
map 和multimap 的区别:
map不允许key重复,而multimap允许key重复
2 map的构造和赋值
构造函数
map<T1, T2> mapT; // 默认构造函数
map(const map &st); // 拷贝构造函数
赋值
map& operator=(const map &st); // 重载等号操作符
#include <iostream>
#include <fstream>
#include <string>
#include <map>
using namespace std;
// map的构造和赋值
void printMap(map<string,int> &m) {
for(map<string,int>::iterator it = m.begin();it!=m.end();it++) {
cout << "姓名:" << it->first << " 年龄:" << it->second << endl;
}
cout << endl;
}
void test01() {
map<string,int> m;
m.insert(pair<string,int>("貂蝉",18));
m.insert(pair<string,int>("小乔",19));
m.insert(pair<string,int>("孙尚香",17));
m.insert(pair<string,int>("甄姬",16));
m.insert(pair<string,int>("西施",20));
printMap(m);
// 拷贝构造函数
map<string,int> m2(m);
printMap(m2);
// 赋值操作
map<string,int> m3;
m3 = m;
printMap(m3);
}
int main(int argc, char const *argv[]) {
test01();
return 0;
}
3. map 大小和交换
函数原型:
size(); // 返回 map 中元素的个数
empty(); // 判断 map 是否为空
swap(map x); // 将 x 和当前 map 中的元素进行互换
#include <iostream>
#include <fstream>
#include <string>
#include <map>
using namespace std;
// map 大小和交换
void printMap(map<string,int> &m) {
for(map<string,int>::iterator it = m.begin();it!=m.end();it++) {
cout << "姓名:" << it->first << " 年龄:" << it->second << endl;
}
cout << endl;
}
void test01() {
map<string,int> m;
m.insert(pair<string,int>("貂蝉",18));
m.insert(pair<string,int>("小乔",19));
m.insert(pair<string,int>("孙尚香",17));
m.insert(pair<string,int>("甄姬",16));
m.insert(pair<string,int>("西施",20));
cout << "map 大小:" << m.size() << endl;
if (m.empty())
{
cout << "map 为空" << endl;
}
else{
cout << "map 不为空" << endl;
}
map<string,int> m2;
m2.insert(pair<string,int>("妲己",21));
m2.insert(pair<string,int>("王昭君",20));
m2.insert(pair<string,int>("杨玉环",18));
cout << "交换前:" << endl;
printMap(m);
printMap(m2);
cout << "交换后:" << endl;
m.swap(m2);
printMap(m);
printMap(m2);
}
int main(int argc, char const *argv[]) {
test01();
return 0;
}
4.map 插入和删除
函数原型:
inserrt(elem) // 在容器中插入元素
clear() // 删除所有元素
erase(pos) // 删除pos迭代器所指的元素,返回下一个元素的迭代器
erase(beg,end) // 删除迭代器从beg到end的所有元素
erase(key) // 删除key所指的元素
#include <iostream>
#include <fstream>
#include <string>
#include <map>
using namespace std;
// map 插入和删除
void printMap(map<string,int> &m) {
for(map<string,int>::iterator it = m.begin();it!=m.end();it++) {
cout << "姓名:" << it->first << " 年龄:" << it->second << endl;
}
cout << endl;
}
void test01() {
map<string,int> m;
// 第一种插入方式
m.insert(pair<string,int>("貂蝉",18));
// 第二种插入方式
m.insert(make_pair("小乔",19));
// 第三种插入方式
m.insert(map<string,int>::value_type("孙尚香",17));
// 第四种插入方式
m["甄姬"] = 16;
m.insert(pair<string,int>("西施",20));
// []不建议插入,如果key存在,则修改value,如果key不存在,则插入pair
// 可以用[]来访问value
cout << m["甄姬"] << endl;
printMap(m);
// 删除
m.erase(m.begin());
printMap(m);
m.erase("甄姬"); // 删除key为甄姬的元素
printMap(m);
m.erase(m.begin(),m.end()); // 删除迭代器区间[begin,end)的元素 相当于清空
printMap(m);
}
int main(int argc, char const *argv[]) {
test01();
return 0;
}
5. map查找和统计
函数原型:
map<T1,T2>::find(key); // 查找key,如果查到,返回该键的元素的迭代器;如果查不到,返回map.end();
map<T1,T2>::count(key); // 查找key,如果查到,返回1;如果查不到,返回0;
#include <iostream>
#include <fstream>
#include <string>
#include <map>
using namespace std;
// map查找和统计
void printMap(map<string,int> &m) {
for(map<string,int>::iterator it = m.begin();it!=m.end();it++) {
cout << "姓名:" << it->first << " 年龄:" << it->second << endl;
}
cout << endl;
}
void test01() {
map<string,int> m;
// 第一种插入方式
m.insert(pair<string,int>("貂蝉",18));
// 第二种插入方式
m.insert(make_pair("小乔",19));
// 第三种插入方式
m.insert(map<string,int>::value_type("孙尚香",17));
// 第四种插入方式
m["甄姬"] = 16;
m.insert(pair<string,int>("西施",20));
map<string,int>::iterator pos = m.find("小乔");
if(pos != m.end()) {
cout << "找到了小乔,年龄为:" << pos->second << endl;
}
else {
cout << "未找到小乔" << endl;
}
cout << "num " << m.count("小乔") << endl;
}
int main(int argc, char const *argv[]) {
test01();
return 0;
}
6. map容器的排序
利用防函数可以改变排序规则
#include <iostream>
#include <fstream>
#include <string>
#include <map>
using namespace std;
// map容器的排序
class MyCompare {
public:
bool operator()(int v1,int v2) const {
return v1 > v2;
}
};
void printMap(map<int,string,MyCompare> &m) {
for(map<int,string,MyCompare>::iterator it = m.begin();it!=m.end();it++) {
cout << "id: " << it->first << " 名字: " << it->second << endl;
}
cout << endl;
}
void test01() {
map<int,string,MyCompare> m;
m.insert(make_pair(1,"西施"));
m.insert(make_pair(2,"貂蝉"));
m.insert(make_pair(3,"王昭君"));
m.insert(make_pair(4,"杨玉环"));
m.insert(make_pair(5,"杨贵妃"));
printMap(m);
}
int main(int argc, char const *argv[]) {
test01();
return 0;
}