C++ map基础概念、map对象创建、map赋值操作、map大小操作、map数据插入、map数据删除、map数据修改、map数据统计
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;// 1m.insert(pair<int, int>(1, 10));printMap(m);// 2m.insert(make_pair(2, 56));printMap(m);// 3m.insert(map<int, int>::value_type(5, 45));printMap(m);// 4m[6] = 8;printMap(m);// 5pair< map<int, int>::iterator, bool> ret = m.insert(make_pair(2, 21)); // 这里直接插入失败,只要有已有的key值,就会插入失败cout << ret.second << endl;printMap(m);// 6m[2] = 48; printMap(m); // 这里修改成功,这里却不一样,是可以修改的,这就是两种插入方式的差别// 7m[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;
}