- P231. map容器-构造和赋值
- P232. ...-大小和交换
- P233. ...-插入和删除
- P234. ...-查找和统计
- P235. ...-排序
- P231. 构造和赋值
——————————————————————————————————————————————————————————
构造:
map<T1,T2> mp;
// map 默认构造
map(const map& map);
// 拷贝构造
赋值:
map& operator=(const map& map);
// 重载等号运算符
示例:
#include <iostream>
#include <map>
using namespace std;
// map 容器 构造和赋值
// 打印map容器
void printMap(map<int, int>& m) {
for (map<int, int>::iterator it = m.begin(); it != m.end(); it++) {
// ★★★两种方式访问
cout << "key:" << (*it).first << "\tvalue:" << it->second << endl;
}
}
void test01() {
// ★★创建map容器
map<int, int>m;
// 插值
m.insert(pair<int, int>(1, 10)); // ★★★pair<int, int>(1, 10)是匿名对组
m.insert(pair<int, int>(4, 40));
m.insert(pair<int, int>(3, 30));
m.insert(pair<int, int>(2, 20));
printMap(m);
cout << endl;
// 拷贝构造
map<int, int>m2(m); // ★★★
cout << "m2:" << endl;
printMap(m2);
cout << endl;
// 赋值
map<int, int>m3;
m3 = m; // ★★★
cout << "m3:" << endl;
printMap(m3);
}
int main() {
test01();
return 0;
}
res:
虽然我们插入数据的时候,没有按key的大小顺序插入,但是打印出来发现map确实会按key值(不是value值)从小到大排序。
总结:map中所有元素都是成对出现,插入数据时候要使用对组
- P232. 大小和交换
—————————————————————————————————————————————————————————
示例:
#include <iostream>
#include <map>
using namespace std;
// map 容器 大小和交换
// 打印map容器
void printMap(map<int, int>& m) {
for (map<int, int>::iterator it = m.begin(); it != m.end(); it++) {
cout << "key:" << (*it).first << "\tvalue:" << it->second << endl;
}
}
// 大小
void test01() {
map<int, int>m;
m.insert(pair<int, int>(1, 10));
m.insert(pair<int, int>(2, 20));
m.insert(pair<int, int>(3, 30));
m.insert(pair<int, int>(4, 40));
if (m.empty()) { // ★★★
cout << "m为空" << endl;
}
else {
cout << "m不为空" << endl;
cout << "m的大小为:" << m.size() << endl; // ★★★
}
}
// 交换
void test02() {
map<int, int>m;
m.insert(pair<int, int>(1, 10));
m.insert(pair<int, int>(2, 20));
m.insert(pair<int, int>(3, 30));
m.insert(pair<int, int>(4, 40));
map<int, int>m2;
m2.insert(pair<int, int>(5, 100));
m2.insert(pair<int, int>(6, 200));
m2.insert(pair<int, int>(7, 300));
cout << "交换前" << endl;
cout << "m:" << endl;
printMap(m);
cout << "m2:" << endl;
printMap(m2);
// 交换
m.swap(m2); // ★★★
cout << "交换后" << endl;
cout << "m:" << endl;
printMap(m);
cout << "m2:" << endl;
printMap(m2);
}
int main() {
test01();
test02();
return 0;
}
res:
- P233. 插入和删除
——————————————————————————————————————————————————————————
示例:
#include <iostream>
#include <map>
using namespace std;
// map 容器 插入和删除
// 打印map容器
void printMap(map<int, int>& m) {
for (map<int, int>::iterator it = m.begin(); it != m.end(); it++) {
cout << "key:" << (*it).first << "\tvalue:" << it->second << endl;
}
cout << endl;
}
void test01() {
map<int, int>m;
// 插入
// ★★第一种
m.insert(pair<int, int>(1, 10));
// ★★★第二种
m.insert(make_pair(2, 20));
// 第三种(不建议)
m.insert(map<int, int>::value_type(3, 30));
// 第四种
// []的方式不建议插入; 可以利用key访问value
m[4] = 40;
cout << m[5] << endl; // 此时并没有key为5的值,但是map自己会造一个m[5]=0,对于我们来说这样不好
printMap(m);
// 删除
m.erase(m.begin()); // ★★★按迭代器删除
printMap(m);
m.erase(3); // ★★★删除键值(key)为3的对组
printMap(m);
m.erase(m.begin(), m.end()); // ★★★按区间删除
// m.clear(); // ★★★清空
}
int main() {
test01();
return 0;
}
res:
- P234. 查找和统计
——————————————————————————————————————————————————————————
#include <iostream>
#include <map>
using namespace std;
// map 容器 查找和统计
// 打印map容器
void printMultimap(multimap<int, int>& m) {
for (map<int, int>::iterator it = m.begin(); it != m.end(); it++) {
cout << "key:" << (*it).first << "\tvalue:" << it->second << endl;
}
cout << endl;
}
void test01() {
// 查找
map<int, int>m;
m.insert(make_pair(1, 10));
m.insert(make_pair(2, 20));
m.insert(make_pair(3, 30));
m.insert(make_pair(3, 40)); // ★★★map不允许插入重复的key值,对于重复插入的key值,只有第一次插入的有效
map<int, int>::iterator pos = m.find(3); // ★★★
if (pos != m.end()) {
cout << "查到了元素 key = " << pos->first << " value = " << pos->second << endl;
}
else {
cout << "未找到元素" << endl;
}
// 统计
// map不允许插入重复key元素,count要么是0要么是1
// multimap的count可以大于1
int num = m.count(3); // ★★★
cout << "num = " << num << endl;
multimap<int, int>m2; // ★★★
m2.insert(make_pair(1, 10));
m2.insert(make_pair(1, 20));
m2.insert(make_pair(1, 10));
int num2 = m2.count(1);
cout << "num2 = " << num2 << endl;
printMultimap(m2);
}
int main() {
test01();
return 0;
}
res:
- P235. 排序
——————————————————————————————————————————————————————————
#include <iostream>
#include <map>
using namespace std;
// map 容器 排序
// 仿函数
class MyCompare {
public:
// 降序
bool operator()(int v1, int v2)const { // ★★★在后面加const,否则报错
return v1 > v2;
}
};
void test01() {
map<int, int, MyCompare>m; // ★★★构造map容器的时候,如果想修改排序规则,加上仿函数; map<int, int, MyCompare>
m.insert(make_pair(1, 10));
m.insert(make_pair(2, 20));
m.insert(make_pair(3, 30));
m.insert(make_pair(4, 40));
m.insert(make_pair(5, 50));
for (map<int, int, MyCompare>::iterator it = m.begin(); it != m.end(); it++) { // ★★★map<int, int, MyCompare>::iterator
cout << it->first << "\t" << it->second << endl;
}
}
int main() {
test01();
return 0;
}
res:
总结:
- 利用仿函数可以指定map容器的排序规则
- 对于自定义数据类型,map必须要指定排序规则,同set容器
(〃>_<;〃)(〃>_<;〃)(〃>_<;〃)
标签:map,cout,insert,容器,P231,C++,pair,make From: https://www.cnblogs.com/wjjgame/p/17636412.html