map的使用频率很高,仅次于vector,先了解下pair的概念:
pair 概念:
template<class _Ty1, class Ty2>
struct pair{
_Ty1 first; // 这两个可以是任意的类型
_Ty2 second;
};
eg:pair<int, int> p(13, 14)
pair<int, int> p = make_pair(13, 14);
map特点:
1 容器中所有元素都是pair,first不重复
2 pair中的第一个元素都是key(键),第二个元素是value(值)
3 所有元素都会根据元素的key值排序
multimap特点:
1 容器中所有元素都是pair,first可以重复
2 pair中的第一个元素都是key(键),第二个元素是value(值)
3 所有元素都会根据元素的key值排序
容器特点:
线性容器:vector、string、list
树形容器:set、multiset、map、multimap
代码见下,助理解
#include<iostream>
#include<map>
#include<vector>
using namespace std;
int main() {
pair<int, int> p1;
p1.first = 13;
p1.second = 14;
cout << p1.first << p1.second << endl;
pair<int, string> p2(2, "333");
cout << p2.first << p2.second << endl;
pair<char, int> p3 = make_pair(52, 0);
cout << p3.first << p3.second << endl;
map<int, int> m;
return 0;
}
map对象创建,有常用的几种方式,见以下代码
#include<iostream>
#include<map>
#include<vector>
using namespace std;
void printMap(const map<int, int>& m) {
for (map<int, int>::const_iterator it = m.begin(); it != m.end(); it++) {
cout << "key = " << it->first << " " << "value = " << it->second << endl;
}
cout << "-------------------------" << endl;
}
int main() {
// 1 默认构造函数
map<int, int> m1;
cout << "ml: " << endl;
printMap(m1);
// 2 初始化列表
map<int, int> m2_1 = {
pair<int, int>(1, 10),
pair<int, int>(4, 45),
pair<int, int>(6, 13),
pair<int, int>(5, 50)
};
cout << "m2_1:" << endl;
printMap(m2_1);
map<int, int> m2_2 ({
pair<int, int>(1, 10),
pair<int, int>(4, 45),
pair<int, int>(6, 13),
pair<int, int>(5, 50)
});
cout << "m2_2: " << endl;
printMap(m2_2);
// 3 迭代器
map<int, int> m3(m2_1.begin(), m2_1.end());
cout << "m3: " << endl;
printMap(m3);
// 4 拷贝构造
map<int, int> m4(m3);
cout << "m4: " << endl;
printMap(m4);
return 0;
}
map赋值操作,代码见下
#include<iostream>
#include<map>
#include<vector>
using namespace std;
void printMap(const map<int, int>& m) {
for (map<int, int>::const_iterator it = m.begin(); it != m.end(); it++) {
cout << "key = " << it->first << " " << "value = " << it->second << endl;
}
cout << "-------------------------" << endl;
}
int main() {
map<int, int> m = {
pair<int, int>(1, 10),
pair<int, int>(4, 12),
pair<int, int>(2, 30),
pair<int, int>(5, 19),
};
cout << "m: " << endl;
printMap(m);
// 1 = 赋值
map<int, int> m1;
m1 = m;
printMap(m1);
// 2 = 赋值列表
map<int, int> m2;
m2 = {
pair<int, int>(1, 15),
pair<int, int>(4, 14),
pair<int, int>(2, 35),
pair<int, int>(5, 15),
};
printMap(m2);
//
return 0;
}
map大小操作,代码见下
#include<iostream>
#include<map>
#include<vector>
using namespace std;
void printMap(const map<int, int>& m) {
for (map<int, int>::const_iterator it = m.begin(); it != m.end(); it++) {
cout << "key = " << it->first << " " << "value = " << it->second << endl;
}
cout << "-------------------------" << endl;
}
int main() {
map<int, int> m1;
cout << m1.empty() << endl;
cout << m1.size() << endl;
map<int, int> m2 = { pair<int, int>(1, 10), pair<int, int>(4, 15) };
cout << m2.empty() << endl;
cout << m2.size() << endl;
return 0;
}
map数据插入,代码见下:
#include<iostream>
#include<map>
#include<vector>
using namespace std;
void printMap(const map<int, int>& m) {
for (map<int, int>::const_iterator it = m.begin(); it != m.end(); it++) {
cout << "key = " << it->first << " " << "value = " << it->second << endl;
}
cout << "-------------------------" << endl;
}
int main() {
map<int, int> m;
// 1
m.insert(pair<int, int>(1, 10));
printMap(m);
// 2
m.insert(make_pair(2, 56));
printMap(m);
// 3
m.insert(map<int, int>::value_type(5, 45));
printMap(m);
// 4
m[6] = 8;
printMap(m);
// 5
pair< map<int, int>::iterator, bool> ret = m.insert(make_pair(2, 21)); // 这里直接插入失败,只要有已有的key值,就会插入失败
cout << ret.second << endl;
printMap(m);
// 6
m[2] = 48;
printMap(m); // 这里修改成功,这里却不一样,是可以修改的,这就是两种插入方式的差别
// 7
m[0];
printMap(m); // 这里是没有的key值,也会创建了一个新的值
return 0;
}
map插入,代码见下
#include<iostream>
#include<map>
#include<vector>
using namespace std;
void printMap(const map<int, int>& m) {
for (map<int, int>::const_iterator it = m.begin(); it != m.end(); it++) {
cout << "key = " << it->first << " " << "value = " << it->second << endl;
}
cout << "-------------------------" << endl;
}
int main() {
map<int, int> m = {
pair<int, int>(1, 4),
pair<int, int>(3, 14),
pair<int, int>(2, 42),
pair<int, int>(4, 49),
};
for (int i = 4; i <= 5; ++i) {
map<int, int>::iterator it = m.find(i);
if (it != m.end()) {
cout << "找到键值对:(" << it->first << "," << it->second << ")" << endl;
}
else {
cout << "未找到键值:" << i << endl;
}
}
return 0;
}
map数据删除,代码见下
#include<iostream>
#include<map>
#include<vector>
using namespace std;
void printMap(const map<int, int>& m) {
for (map<int, int>::const_iterator it = m.begin(); it != m.end(); it++) {
cout << "key = " << it->first << " " << "value = " << it->second << endl;
}
cout << "-------------------------" << endl;
}
int main() {
map<int, int> m = {
pair<int, int>(1, 4),
pair<int, int>(3, 14),
pair<int, int>(2, 42),
pair<int, int>(4, 49),
};
printMap(m);
// 值删除
m.erase(1);
printMap(m);
// 迭代器删除
m.erase(m.begin());
printMap(m);
// 迭代器区间删除
m.erase(m.begin(), m.end());
printMap(m);
return 0;
}
map数据修改,代码见下:
#include<iostream>
#include<map>
#include<vector>
using namespace std;
void printMap(const map<int, int>& m) {
for (map<int, int>::const_iterator it = m.begin(); it != m.end(); it++) {
cout << "key = " << it->first << " " << "value = " << it->second << endl;
}
cout << "-------------------------" << endl;
}
int main() {
map<int, int> m;
m.insert(make_pair(1, 10));
m.insert(make_pair(5, 15));
m.insert(make_pair(2, 45));
m[2] = 1314;
printMap(m);
m[5]++;
printMap(m);
return 0;
m[2] -= 20;
printMap(m);
}
map数据统计,代码见下:
#include<iostream>
#include<map>
#include<vector>
using namespace std;
void printMap(const map<int, int>& m) {
for (map<int, int>::const_iterator it = m.begin(); it != m.end(); it++) {
cout << "key = " << it->first << " " << "value = " << it->second << endl;
}
cout << "-------------------------" << endl;
}
int main() {
map<int, int> m = {
pair<int, int>(1, 4),
pair<int, int>(3, 45),
pair<int, int>(4, 55),
pair<int, int>(8, 49),
};
for (int i = -1; i < 9; ++i) {
cout << i << "出现次数为:" << m.count(i) << endl;
}
multimap<int, int> mm = {
pair<int, int>(1, 4),pair<int, int>(1, 4),pair<int, int>(1, 4),pair<int, int>(1, 4),
pair<int, int>(3, 45),pair<int, int>(3, 45),pair<int, int>(3, 45),pair<int, int>(3, 45),
pair<int, int>(4, 55),pair<int, int>(4, 55),pair<int, int>(4, 55),
pair<int, int>(8, 49),pair<int, int>(8, 49)
};
for (int i = -1; i < 9; ++i) {
cout << i << "出现次数为:" << mm.count(i) << endl;
}
return 0;
}