构造和赋值
/*
* 构造和赋值
*/
/*
* 简介:
* map中所有元素都是pair
* pair中第一个元素为key(键值),起到索引作用,第二个元素为value(实值)
* 所有元素都会根据元素的键值自动排序
*
* 本质:
* map/multimap属于关联式容器,底层是用二叉树实现
*
* 优点:
* 可以根据key值快速找到value值
*
* map和multimap区别:
* map不允许容器中有重复key值元素
* multimap允许容器中有重复key值元素
*
*/
#include <iostream>
#include <map>
void printMap(std::map<int, int> &m)
{
for(auto elem:m)
{
std::cout<<"key: "<<elem.first<<" value: "<<elem.second;
}
std::cout<<std::endl;
}
void test01()
{
//创建map容器
std::map<int, int> m;
m.insert(std::pair<int, int>(1, 10));
m.insert(std::pair<int, int>(3, 30));
m.insert(std::pair<int, int>(2, 20));
m.insert(std::pair<int, int>(4, 40));
printMap(m);
//拷贝构造
std::map<int, int> m2(m);
printMap(m2);
//赋值
std::map<int, int> m3;
m3 = m2;
printMap(m3);
}
int main()
{
test01();
return 0;
}
大小和交换
/*
* 大小和交换
*/
/*
* 统计map容器大小以及交换map容器
*/
#include <iostream>
#include <map>
void printMap(std::map<int, int> &m)
{
for(auto elem:m)
{
std::cout<<"key: "<<elem.first<<" value: "<<elem.second;
}
std::cout<<std::endl;
}
//大小
void test01()
{
std::map<int, int> m;
m.insert(std::pair<int, int>(1, 10));
m.insert(std::pair<int, int>(2, 20));
m.insert(std::pair<int, int>(3, 30));
if(m.empty())
{
std::cout<<"m is empty"<<std::endl;
}
else
{
std::cout<<"m is not empty"<<std::endl;
std::cout<<"m.size(): "<<m.size()<<std::endl;
}
}
//交换
void test02()
{
std::map<int, int> m;
m.insert(std::pair<int, int>(1, 10));
m.insert(std::pair<int, int>(2, 20));
m.insert(std::pair<int, int>(3, 30));
std::map<int, int> m2;
m2.insert(std::pair<int, int>(4, 100));
m2.insert(std::pair<int, int>(5, 200));
m2.insert(std::pair<int, int>(6, 300));
std::cout<<"before swap: "<<std::endl;
printMap(m);
printMap(m2);
std::cout<<"after swap: "<<std::endl;
m.swap(m2);
printMap(m);
printMap(m2);
}
int main()
{
// test01();
test02();
return 0;
}
插入和删除
/*
* 插入和删除
*/
/*
* map容器进行插入数据和删除数据
*/
#include <iostream>
#include <map>
void printMap(std::map<int, int> &m)
{
for(auto elem:m)
{
std::cout<<"key: "<<elem.first<<" value: "<<elem.second<<std::endl;
}
std::cout<<std::endl;
}
void test01()
{
std::map<int, int> m;
//插入
//第一种
m.insert(std::pair<int, int>(1, 10));
//第二种
m.insert((std::make_pair(2, 20)));
//第三种(不建议)
m.insert(std::map<int, int>::value_type(3, 30));
//第四种
m[4] = 40;
//[]不建议插入,用途 可以通过key访问到value
// std::cout<<m[5]<<std::endl;
printMap(m);
//删除
m.erase(m.begin());
printMap(m);
m.erase(3);//按照key删除
printMap(m);
//清空
// m.erase(m.begin(), m.end());
// printMap(m);
m.clear();
printMap(m);
}
int main()
{
test01();
return 0;
}
查找和统计
/*
* 查找和统计
*/
/*
* 对map容器进行查找数据以及统计数据
*/
#include <iostream>
#include <map>
void test01()
{
//查找
std::map<int, int> m;
m.insert(std::pair<int, int>(1, 10));
m.insert(std::pair<int, int>(2, 20));
m.insert(std::pair<int, int>(3, 30));
auto pos = m.find(3);
if(pos != m.end())
{
std::cout<<"found: "<<std::endl;
std::cout<<"key: "<<pos->first<<" value: "<<pos->second<<std::endl;
}
else
{
std::cout<<"not found"<<std::endl;
}
//统计
//map不允许插入重复key元素,count统计而言, 要么结果是0 要么是1
//multimap的count统计可能大于1
int num = m.count(3);
std::cout<<"num = "<<num<<std::endl;
}
int main()
{
test01();
return 0;
}
map容器排序
/*
* map容器排序
*/
/*
* 学习目标:
* map容器默认排序规则为 按照key值从小到达排序,掌握如何改变排序规则
*
* 主要技术点:
* 利用仿函数,可以改变排序规则
* 对于自定义数据类型,map必须要指定排序规则,同set容器
*/
#include <iostream>
#include <map>
class myCompare
{
public:
bool operator()(int v1, int v2)
{
//降序
return v1 > v2;
}
};
void printMap(std::map<int, int, myCompare> &m)
{
for(auto elem:m)
{
std::cout<<"key: "<<elem.first<<" value: "<<elem.second<<std::endl;
}
std::cout<<std::endl;
}
void test01()
{
std::map<int, int, myCompare> m;
m.insert(std::make_pair(1, 10));
m.insert(std::make_pair(2, 20));
m.insert(std::make_pair(5, 50));
m.insert(std::make_pair(3, 30));
m.insert(std::make_pair(4, 40));
printMap(m);
}
int main()
{
test01();
return 0;
}