1.map容器基本概念
简介:
- map中所有元素都是pair
- pair中第一个为key(键值),起到索引作用,第二个为value(实值)
- 所有元素都会根据元素的key值自动排序
本质:
- map/multimap属于关联式容器,底层结构是用二叉树实现
优点:
- 可以根据key值快速找到value值
map/multimap区别:
- map不允许容器中有重复key值元素
- multimap允许容器中有重复key值元素
2.map容器的构造和赋值
功能描述:
对map容器进行构造和赋值操作
注意:map中所有元素都是成对出现,插入数据时候要是用对组
/*
函数原型
构造
map<T1,T2> mp map 默认构造函数
map(const map &mp) 拷贝构造函数
赋值
map& operator = (const map &mp) 重载等号操作符
*/
void printMap(map<int, int>& m) {
for (map<int, int>::iterator it = m.begin(); it != m.end(); it++) {
cout << "key = " << (*it).first << "value = " << (*it).second << endl;
}
cout << endl;
}
//map容器 构造和赋值
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));
printMap(m);
//拷贝构造
map<int, int>m2(m);
printMap(m2);
//赋值
map<int, int>m3;
m3 = m2;
printMap(m3);
}
int main() {
test01();
system("pause");
return 0;
}
3.map容器大小和交换
功能描述:
统计map容器大小以及交换map容器
/*
函数原型
size() 返回容器中元素数目
empty() 判断容器是否为空
swap(st) 交换两个集合容器
*/
void printMap(map<int, int>& m) {
for (map<int, int>::iterator it = m.begin(); it != m.end(); it++) {
cout << "key = " << (*it).first << "value = " << (*it).second << endl;
}
cout << endl;
}
//map容器 构造和赋值
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));
//map 的为空 和 大小判断
if (m.empty()) {
cout << "m为空" << endl;
}else {
cout << "m不为空" << endl;
cout<< "m的大小为:"<< m.size() << endl;
}
//map交换
map<int, int>m2;
m2.insert(pair<int, int>(5, 50));
m2.insert(pair<int, int>(6, 60));
m2.insert(pair<int, int>(7, 70));
m2.insert(pair<int, int>(8, 80));
cout << "交换前:" << endl;
printMap(m);
printMap(m2);
cout << "交换后:" << endl;
m.swap(m2);
printMap(m);
printMap(m2);
}
int main() {
test01();
system("pause");
return 0;
}
4.map插入和删除
功能描述:map容器进行插入数据和删除数据
/*
函数原型
insert(elem) 在容器中插入元素
clear() 清除所有元素
erase(pos) 删除pos迭代器所指的元素,返回下一个元素的迭代器
erase(beg,end) 删除区间[beg,end]的所有元素,返回下一个元素的迭代器
erase(key) 删除容器中值为key的元素
*/
void printMap(map<int, int>& m) {
for (map<int, int>::iterator it = m.begin(); it != m.end(); it++) {
cout << "key = " << (*it).first << "value = " << (*it).second << endl;
}
cout << endl;
}
//map容器 构造和赋值
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;
printMap(m);
//删除
m.erase(m.begin());
printMap(m);
m.erase(3);//删除key值为3 的;
//清空
m.clear();
m.erase(m.begin(), m.end());
}
int main() {
test01();
system("pause");
return 0;
}
5.map查找和统计
功能描述:对map容器进行查找数据以及统计数据
/*
函数原型
find(key) 查找key是否存在,若存在,返回该键的元素的迭代器,若不存在,返回set.end();
count(key) 统计key元素的个数
*/
void printMap(map<int, int>& m) {
for (map<int, int>::iterator it = m.begin(); it != m.end(); it++) {
cout << "key = " << (*it).first << "value = " << (*it).second << endl;
}
cout << endl;
}
//map容器 构造和赋值
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));
//查找
map<int, int>::iterator pos = m.find(3);
if (pos != m.end()) {
cout << "查找到了元素 key = " << (*pos).first << " value = " << pos->second << endl;
}
else {
cout << "未找到元素" << endl;
}
//统计
//map不允许插入重复可以元素 所以返回值只有0和1
int num = m.count(3);
cout << "num = " << num << endl;
}
int main() {
test01();
system("pause");
return 0;
}
6.map容器排序
class MyCompare {
public:
bool operator()(int v1,int v2) const {
return v1 > v2;
}
};
void test01() {
//构造 并修改排序规则
map<int, int, MyCompare> 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));
for (map<int, int, MyCompare>::iterator it = m.begin(); it != m.end(); it++) {
cout << "key = " << (*it).first << "value = " << (*it).second << endl;
}
cout << endl;
}
int main() {
test01();
system("pause");
return 0;
}