C++>关联式容器,map,set,multimap,multiset的使用方法

关联式容器

非线性储存结构,存储对应关系的键值对,查找元素时间复杂度O(logN)
在数据检索时效率比序列式容器的效率高,底层是二叉搜索的平衡树结构。
C++>关联式容器,map,set,multimap,multiset的使用方法_第1张图片

容器 存放元素 元素要求
map key不能重复
set < key > key不能重复
multimap key可以重复
multiset < key > key可以重复

map

topK的问题,用ip作为key,次数作为value: while(feof(pf))m[“IP”]+=1;
字典<英文单词,汉语释义>

  1. map中的的元素是键值对
  2. map中的key是唯一的,并且不能修改
  3. 默认按照小于的方式对key进行比较
  4. map中的元素如果用迭代器去遍历,可以得到一个有序的序列
  5. map的底层为平衡搜索树(红黑树),查找效率比较高
  6. 支持[]操作符,operator[]中实际进行插入查找。
#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;
}
  • 获取map中的所有key
     用迭代器获取到的pair->first就是key。
     second就是value
  • map的基本操作函数

begin() 返回指向map头部的迭代器
clear() 删除所有元素
count() 返回指定元素出现的次数
empty() 如果map为空则返回true
end() 返回指向map末尾的迭代器
equal_range() 返回特殊条目的迭代器对
erase() 删除一个元素
find(键) 查找一个元素
get_allocator() 返回map的配置器
insert() 插入元素
key_comp() 返回比较元素key的函数

multimap

没有下标运算符[ ],key可以重复,就不可以按key查返回了,其它操作相同

  1. multimap中的key是可以重复的。
  2. multimap中的元素默认将key按照小于来比较。
  3. multimap中没有重载operator[]操作。
  4. 使用时与map包含的头文件相同

set

常用来去重并排序,
相比于map少了下标运算符[ ],只用key,[ ]没有意义

  1. 与map/multimap不同,set中只放value,但在底层实际存放的是由构成的键值对。
  2. set中插入元素时,只需要插入value即可,不需要构造键值对。
  3. set中的元素不可以重复(因此可以使用set进行去重)。
  4. 使用set的迭代器遍历set中的元素,可以得到有序序列。
  5. set中的元素默认按照小于来比较。
  6. set中的元素不允许修改。
  7. set中的底层使用二叉搜索树(红黑树)来实现。

multiset

主要用来排序

  1. multiset中再底层中存储的是的键值对。
  2. mtltiset的插入接口中只需要插入即可。
  3. 与set的区别是,multiset中的元素可以重复,set是中value是唯一的。
  4. 使用迭代器对multiset中的元素进行遍历,可以得到有序的序列。
  5. multiset中的元素不能修改。
  6. multiset的作用:可以对元素进行排序。
#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;
}

你可能感兴趣的:(#,C++,STL,map,set,multiset,multimap)