map中所有的元素都是pair,pair中第一个元素为key,起到索引作用,第二个元素为value;所有元素都会根据元素的键值自动排序;map、multimap属于关联式容器,底层结构是二叉树实现的;可以通过key快速找到value值;map不允许有重复key的元素,multimap允许有重复key的元素。
需要引入头文件#include
默认构造
map<int, int> m;
拷贝构造
map<int, int> m2(m);
赋值
operator=
代码示例
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 testMap01() {
//默认构造
map<int, int> m;
//默认按照key升序
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);
/*
key=1 value= 10
key=2 value= 20
key=3 value= 30
key=4 value= 40
*/
//拷贝构造
map<int, int> m2(m);
printMap(m2);
map<int, int> m3;
//赋值
m3 = m;
printMap(m3);
}
代码示例
void testMap02() {
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);
/*
key=1 value= 10
key=2 value= 20
key=3 value= 30
key=4 value= 40
*/
if (m.empty()) {
cout << "不为空"<<endl;
}
else {
cout << "元素个数:" << m.size()<<endl;
}
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));
m2.insert(pair<int, int>(8, 400));
printMap(m2);
/*key=5 value= 100
key=6 value= 200
key=7 value= 300
key=8 value= 400*/
m.swap(m2);
printMap(m);
/*key=5 value= 100
key=6 value= 200
key=7 value= 300
key=8 value= 400*/
printMap(m2);
/*key=1 value= 10
key=2 value= 20
key=3 value= 30
key=4 value= 40*/
}
代码示例
void testMap03() {
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));
//插入第四种
//这种方法如果插入错误,会创建一个value为0的对组保存到map中,所以不建议这种方式
m[4] = 40;
cout << m[6] << endl;
printMap(m);
/*key=1 value= 10
key=2 value= 20
key=3 value= 30
key=4 value= 40*/
/*key=1 value= 10
key=2 value= 20
key=3 value= 30
key=4 value= 40
key=6 value= 0*/
//删除
m.erase(m.begin());
//按照key删除
m.erase(3);
printMap(m);
//区间删除
m.erase(m.begin(),m.end());
//清空
m.clear();
}
代码示例
void testMap04() {
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()) {
//查到了元素key=3 value=30
cout << "查到了元素key=" << pos->first << " value=" << pos->second << endl;
}
else {
cout << "未查到元素" << endl;
}
cout << "统计元素个数" << m.count(1);//1
}
map容器默认排序规则按照key值从小到大排序,利用仿函数可以改变排序规则。
代码示例
class MyCompare {
public :
//重载小括号
bool operator()(int v1,int v2) const
{
return v1 > v2;
}
};
void testMap05() {
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);
/*key=1 value= 10
key=2 value= 20
key=3 value= 30
key=4 value= 40*/
map<int, int,MyCompare> m2;
m2.insert(pair<int, int>(1, 10));
m2.insert(pair<int, int>(2, 20));
m2.insert(pair<int, int>(3, 30));
m2.insert(pair<int, int>(4, 40));
for (map<int, int, MyCompare>::iterator it = m2.begin(); it != m2.end(); it++) {
cout << "key=" << (*it).first << " value= " << it->second << endl;
}
/*key=4 value= 40
key=3 value= 30
key=2 value= 20
key=1 value= 10*/
cout << endl;
}