非线性储存结构,存储对应关系的键值对,查找元素时间复杂度O(logN)
在数据检索时效率比序列式容器的效率高,底层是二叉搜索的平衡树结构。
容器 | 存放元素 | 元素要求 |
---|---|---|
map | key不能重复 | |
set | < key > | key不能重复 |
multimap | key可以重复 | |
multiset | < key > | key可以重复 |
topK的问题,用ip作为key,次数作为value: while(feof(pf))m[“IP”]+=1;
字典<英文单词,汉语释义>
#include
#include
#include
using namespace std;
void TestMap1()
{
map<string, string> m;
m.insert(pair<string,string>("母夜叉","孙二娘"));//插入键值对,构造键值对有两种方法1.pair("母夜叉","孙二娘")
m.insert(pair<string, string>("花和尚", "鲁智深"));
//pair pair<<"花和尚","鲁智深">,true>
//iterator:代表map中的一个key_vluue键值对 bool:insert插入是否成功
m.insert(make_pair("行者", "武松"));//2.make_pair是库提供的构造函数
auto ret=m.insert(pair<string, string>("花和尚", "沙和尚"));//对相同key进行插入,不会报错但是插入无效
//可以查看pair的second的返回值查看是否插入成功,可以使用map::iterator ret=来接收,但是太麻烦,可以直接使用auto
if (ret.second)
cout << "插入沙和尚成功" << endl;
cout << "插入沙和尚失败" << endl;
cout << m.size() << endl;
cout << m["花和尚"] << endl;//通过下标运算符使用key可以查看和修改对应的value//下标运算符[]的重载使用insert,如果不存在就相当于插入默认value
m["行者"] = "孙";
cout << m["行者"] << endl;
m["矮脚虎"] = "王英";//当修改一个不存在的元素时,相当于插入
cout << m.size() << endl;
map<string, string> mcpy;
swap(m, mcpy); //它提供的swap是用来交换两个map里的内容的
}
//map中的key是有序的使用整形更方便看
void TestMap2()
{
int arry[] = { 2, 12, 43, 5, 2, 23, 423, 43, 4, 3, 42, 34 };
map<int, int> m;
for (auto& e : arry)//通过范围for的方式进行插入
m.insert(make_pair(e, e));
//erase//参数可以迭代器,迭代器区间,key
m.erase(5);
//find传入key返回迭代器
//count统计key出现的次数,也就是0或1
//打印看一下
auto it = m.begin();//迭代器方式
while (it != m.end())
{
cout << it->first << "--->" << it->second << endl;
++it;//前置++比后置++效率高
}
cout << endl;
for (auto& e : m)//范围for方式
cout << e.first << "-->" << e.second << endl;
cout << endl;
}
int main()
{
TestMap2();
system("pause");
return 0;
}
begin() 返回指向map头部的迭代器
clear() 删除所有元素
count() 返回指定元素出现的次数
empty() 如果map为空则返回true
end() 返回指向map末尾的迭代器
equal_range() 返回特殊条目的迭代器对
erase() 删除一个元素
find(键) 查找一个元素
get_allocator() 返回map的配置器
insert() 插入元素
key_comp() 返回比较元素key的函数
没有下标运算符[ ],key可以重复,就不可以按key查返回了,其它操作相同
常用来去重并排序,
相比于map少了下标运算符[ ],只用key,[ ]没有意义
主要用来排序
#include
#include
#include//multimap也使用map头文件
#include
using namespace std;
void TestSet()
{
int arry[] = { 2, 3, 3, 434, 45, 2, 3, 324, 3234, 23423, 533, 434, 34, 32, 23, 42, 34, 23, 23423, 4234, 23, 32, 4, 23 };
//去重并排序
set<int> s;
for (auto e : arry)
s.insert(e);
cout << s.size() << endl;
for (auto e : s)
cout << e << " ";
cout << endl;
}
void TestMultimap()
{
multimap<string, string> m;
m.insert(make_pair("蜀国国主", "刘婵"));
m.insert(pair<string, string>("五虎上将", "赵云"));
m.insert(make_pair("五虎上将", "关羽"));
m.insert(make_pair("五虎上将", "张飞"));
m.insert(pair<string, string>("五虎上将", "马超"));
m.insert(make_pair("五虎上将", "黄忠"));
cout << m.size() << endl;
}
void TestMultiset()
{
int arry[] = { 2, 3, 3, 434, 45, 2, 3, 324, 3234, 23423, 533, 434, 34, 32, 23, 42, 34, 23, 23423, 4234, 23, 32, 4, 23 };
//排序
multiset<int> ms;
for (auto e : arry)
ms.insert(e);
for (auto e : ms)
cout << e << " ";
cout << endl;
}
int main()
{
TestSet();
TestMultimap();
TestMultiset();
system("pause");
return 0;
}