概述
1.基本概念
简介:
map中所有元素都是pair
pair中第一个元素为key(键值),起到索引作用,第二个元素为value(实值)
所有元素都会根据元素的键值自动排序
本质:
map/multimap属于关联式容器,底层结构使用二叉树实现
优点:
可以根据key值快速找到value值
map和multimap区别:
map不允许容器中有重复key值元素
multimap允许容器中有重复key值元素
2. map构造和赋值
#include<iostream>
using namespace std;
#include<string>
#include<vector>
#include<deque>
#include<iterator>
#include<list>
#include<algorithm> //标准算法头文件
#include<numeric>
#include<map>
#include<set>
#include<utility>
#include<fstream>
#include<string>
#include<ctime>
#include<stack>
#include<queue>
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;
}
void test01() {
map<int, int>m;
m.insert(pair<int, int>(4, 10));
m.insert(pair<int, int>(2, 50));
m.insert(pair<int, int>(3, 30));
m.insert(pair<int, int>(1, 40)); //根据key来排序
printMap(m);
//拷贝构造
map<int, int>m2(m);
printMap(m2);
//赋值
map<int, int>m3;
m3 = m2;
printMap(m3);
}
int main(int argc,char**argv) {
test01();
system("pause");
return 0;
}
3. map大小和交换
#include<iostream>
using namespace std;
#include<string>
#include<vector>
#include<deque>
#include<iterator>
#include<list>
#include<algorithm> //标准算法头文件
#include<numeric>
#include<map>
#include<set>
#include<utility>
#include<fstream>
#include<string>
#include<ctime>
#include<stack>
#include<queue>
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;
}
//大小
void test01() {
map<int, int>m;
m.insert(pair<int, int>(4, 10));
m.insert(pair<int, int>(2, 50));
m.insert(pair<int, int>(3, 30));
m.insert(pair<int, int>(1, 40)); //根据key来排序
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>(4, 10));
m.insert(pair<int, int>(2, 50));
m.insert(pair<int, int>(3, 30));
m.insert(pair<int, int>(1, 40));
map<int, int>m2;
m2.insert(pair<int, int>(40, 100));
m2.insert(pair<int, int>(20, 500));
m2.insert(pair<int, int>(30, 300));
m2.insert(pair<int, int>(10, 400));
cout << "交换前 " << endl;
printMap(m);
printMap(m2);
cout << "交换后 " << endl;
m.swap(m2);
printMap(m);
printMap(m2);
}
int main(int argc,char**argv) {
//test01();
test02();
system("pause");
return 0;
}
4. map插入和删除
#include<iostream>
using namespace std;
#include<string>
#include<vector>
#include<deque>
#include<iterator>
#include<list>
#include<algorithm> //标准算法头文件
#include<numeric>
#include<map>
#include<set>
#include<utility>
#include<fstream>
#include<string>
#include<ctime>
#include<stack>
#include<queue>
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;
}
//插入
void test01() {
map<int, int>m;
//第一种
m.insert(pair<int, int>(4, 10));
//第二种
m.insert(make_pair(2, 20));
//第三种
m.insert(map<int, int>::value_type(3, 50));
//第四种
m[4] = 40; //把10改成40了
//不建议用第四种插入,[]的方式应该是通过key访问到value
//如果按照下面这种形式插入,因为没有5的值,会制造一个(5,0)的键值对并且会在输出结果第一行返回个0
//cout << m[5] << endl;
printMap(m);
//删除
m.erase(m.begin());
printMap(m);
m.erase(3); //按照key删除
printMap(m);
//清空
m.erase(m.begin(), m.end());
m.clear();
printMap(m);
}
int main(int argc,char**argv) {
test01();
system("pause");
return 0;
}
5. map查找和统计
find(key) 查找key是否存在,存在返回该键的元素的迭代器,不存在,返回set.end();
count(key) 统计key的元素个数
#include<iostream>
using namespace std;
#include<string>
#include<vector>
#include<deque>
#include<iterator>
#include<list>
#include<algorithm> //标准算法头文件
#include<numeric>
#include<map>
#include<set>
#include<utility>
#include<fstream>
#include<string>
#include<ctime>
#include<stack>
#include<queue>
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;
}
void test01() {
map<int, int>m;
m.insert(pair<int, int>(4, 10));
m.insert(pair<int, int>(2, 50));
m.insert(pair<int, int>(1, 20));
m.insert(pair<int, int>(3, 60));
map<int, int>::iterator pos = m.find(4);
if (pos != m.end()) {
cout << "查找到了元素key = " << (*pos).first << " value = " << pos->second << endl;
}
else {
cout << "未找到元素" << endl;
}
//统计
int num = m.count(3);
cout << "num = " << num << endl; //对于map而言,不允许插入重复元素, count要么是0要么是1
multimap<int, int> mu;
mu.insert(pair<int, int>(5, 20));
mu.insert(pair<int, int>(4, 10));
mu.insert(pair<int, int>(4, 10));
mu.insert(pair<int, int>(4, 10));
int num1 = mu.count(4);
cout << "num1 = " << num1 << endl; //multimap 可以 输出为3
}
int main(int argc,char**argv) {
test01();
system("pause");
return 0;
}
6. map容器排序
#include<iostream>
using namespace std;
#include<string>
#include<vector>
#include<deque>
#include<iterator>
#include<list>
#include<algorithm> //标准算法头文件
#include<numeric>
#include<map>
#include<set>
#include<utility>
#include<fstream>
#include<string>
#include<ctime>
#include<stack>
#include<queue>
class myCompare {
public:
bool operator()(int v1, int v2)const { //别忘了加const!!
return v1 > v2;
}
};
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;
}
void test01() {
map<int, int>m;
cout << "正常为升序排列" << endl;
m.insert(pair<int, int>(4, 10));
m.insert(pair<int, int>(2, 50));
m.insert(pair<int, int>(1, 20));
m.insert(pair<int, int>(3, 60));
printMap(m);
cout << "改变为降序排列" << endl;
map<int, int, myCompare>m2;
m2.insert(pair<int, int>(4, 10));
m2.insert(pair<int, int>(2, 50));
m2.insert(pair<int, int>(1, 20));
m2.insert(pair<int, int>(3, 60));
for (map<int, int, myCompare>::iterator it = m2.begin(); it != m2.end(); it++) {
cout << "key = " << it->first << " value = " << it->second << endl;
}
cout << endl;
}
int main(int argc,char**argv) {
test01();
system("pause");
return 0;
}
7. map存放自定义数据类型(自己拓展写的)
#include<iostream>
using namespace std;
#include<string>
#include<vector>
#include<deque>
#include<iterator>
#include<list>
#include<algorithm> //标准算法头文件
#include<numeric>
#include<map>
#include<set>
#include<utility>
#include<fstream>
#include<string>
#include<ctime>
#include<stack>
#include<queue>
class Person {
public:
Person(string name, int age) {
this->m_Name = name;
this->m_Age = age;
}
string m_Name;
int m_Age;
};
class myCompare {
public:
bool operator()(const Person& p1, const Person& p2)const {
return p1.m_Age > p2.m_Age;
}
};
void test01() {
map<Person, int, myCompare> m;
m.insert(pair<Person, int>(Person("刘备", 29), 29));
m.insert(pair<Person, int>(Person("关羽", 39), 39));
m.insert(pair<Person, int>(Person("张飞", 50), 50));
m.insert(pair<Person, int>(Person("赵云", 19), 19));
for (map<Person, int, myCompare>::iterator it = m.begin(); it != m.end(); it++) {
cout << "姓名为: " << it->first.m_Name << " 年龄为: " << it->second << endl;
}
}
int main(int argc, char** argv) {
test01();
system("pause");
return 0;
}
可以跟set对照加强理解
最后
以上就是和谐诺言为你收集整理的黑马:map容器(231~235)的全部内容,希望文章能够帮你解决黑马:map容器(231~235)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复