c++关联容器排序问题

1有序关联容器

map,multimap,set,multiset都要求按照关键字排序:

1.1map

	std::map<int, int>map_a;

	map_a.emplace(5, 2);

	map_a.emplace(3, 2);
	map_a.emplace(1, 1);
	map_a.insert(std::pair<int,int>(2, 2));
	map_a.insert(std::make_pair(7, 6));
	//map_a.insert(std::make_pair(7, 1));
	for (auto m : map_a)
	{
		std::cout << m.first<<"  "<<m.second << std::endl;
	}

结果:
在这里插入图片描述

1.2multimap

	std::multimap<int, int>map_a;
	map_a.emplace(5, 2);
	map_a.emplace(3, 2);
	map_a.emplace(1, 1);
	map_a.insert(std::pair<int,int>(2, 2));
	map_a.insert(std::make_pair(7, 6));
	map_a.insert(std::make_pair(7, 1));
	for (auto m : map_a)
	{
		std::cout << m.first<<"  "<<m.second << std::endl;
	}

结果:
在这里插入图片描述

2无序关联容器

2.1unordered_map

第一个实验

	//std::map<int, int>map_a;
	std::unordered_map<int, int>map_a;
	//std::multimap<int, int>map_a;
	map_a.emplace(5, 2);
	map_a.emplace(3, 2);
	map_a.emplace(1, 1);
	map_a.insert(std::pair<int,int>(2, 2));
	map_a.insert(std::make_pair(7, 6));
	//map_a.insert(std::make_pair(7, 1));
	for (auto m : map_a)
	{
		std::cout << m.first<<"  "<<m.second << std::endl;
	}

结果:排列顺序和插入顺序一致
在这里插入图片描述

第二次实验

	unordered_map<int, std::string> m1;

	m1[5] = "lamb";
	m1[2] = "had";
	m1[3] = "a";
	m1[1] = "mary";
	m1[4] = "little";
	m1[7] = "fleece";
	m1[6] = "whose";
	m1[10] = "fleecey";
	m1[8] = "was";
	m1[9] = "all";

	for (auto it = m1.begin(); it != m1.end(); ++it)
	{
		cout << it->first << " "
		<<it->second << endl;

	}

结果:排列顺序和插入顺序不一致
在这里插入图片描述

3总结

(1)有序关联容器内部实现一般是红黑树,一定会按照关键字(key)排序,关键字要提供<(小于)操作。如果key使用自定义类,需要重载operator<运算符
(2)无序容器内部实现一般是哈希表,不按照关键词排序,但是其内存储存顺序和插入顺序也可能不一致。
(3)只要是关联容器其插入顺序和储存顺序都会不一样,关联容器不能保证插入顺序和储存顺序一致性(即使是unordered系列也不行),如果想要保持一致性请使用顺序容器。


版权声明:本文为xinxiangwangzhi_原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。