STL学习笔记4 —— Unordered Containers

一、Unordered Containers

1. 介绍

  和关联式容器一样,无序容器也使用键值对(pair 类型)的方式存储数据,和关联式容器相比,无序容器具有以下 2 个 特点

  • 无序容器内部存储的键值对是无序的,各键值对的存储位置取决于该键值对中的键
  • 和关联式容器相比,无序容器擅长通过指定键查找对应的值(平均时间复杂度为 O(1));
  • 但对于使用迭代器遍历容器中存储的元素,无序容器的执行效率则不如关联式容器。
2. 分类
Containers Functions
unordered_map 存储键值对 <key, value> 类型的元素,其中各个键值对键的值不允许重复,且该容器中存储的键值对是无序的
unordered_multimap 和 unordered_map 唯一的区别在于,该容器允许存储多个键相同的键值对。
unordered_set 不再以键值对的形式存储数据,而是直接存储数据元素本身(可理解为:该容器存储的全部都是键 key 和值 value 相等的键值对,正因为它们相等,因此只存储 value 即可)。容器存储的元素不能重复,且容器内部存储的元素也是无序的。
unordered_multiset 和 unordered_set 唯一的区别在于,该容器允许存储值相同的元素。

也就是说,C++ 11 标准的 STL 中,在已提供有 4 种关联式容器的基础上,又新增了各自的“unordered”版本(无序版本、哈希版本),提高了查找指定元素的效率。

3. 查找复杂度:
  • vectorlistdeque:O(n)
  • Associative Containers(setmap):O(log n)
  • Unordered Containers:O(1) —— 利用了哈希表查找

二、unordered_set

注意:使用前需包含 unordered_set 头文件(unrdered_multiset也在其中)

#include <unordered_set>
#include <bits/stdc++.h>	// 万能
#include <iostream>
#include <unordered_set>
using namespace std;

int main()
{
    
    
	unordered_set<int> s;
	s.insert(1);
	s.insert(5);
	s.insert(1);		// repeat
	s.insert(2);
	s.insert(4);
	
	for (auto elem : s){
    
    
		cout << elem << " ";
	}
	cout << endl;
	
	for (unordered_set<int>::iterator it=s.begin(); it!=s.end(); it++){
    
    
		cout << *it << " "; 
	}
	
	cout << endl;
	auto it = s.find(2);
	if (it != s.end()){
    
    
		cout << "Successfully!";
	}
	
	return 0; 
}

输出结果为: 不允许元素重复、无序

4 2 5 1
4 2 5 1
Successfully!
--------------------------------
Process exited after 0.8331 seconds with return value 0

三、unordered_map

#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;

int main()
{
    
    
	unordered_map<int, string> umap;
	umap[1] = "aaaa";
	umap.insert(pair<int, string>(5, "bloom"));
	umap.insert(std::make_pair(3, "green"));
	umap[3] = "hot";		// modefy
	
	for (auto elem : umap){
    
    
		cout << elem.first << " " << elem.second << endl; 
	}
	cout << endl;
	
	if (umap.find(3) != umap.end()){
    
    
		cout << (umap.find(3))->second;
	}
	
	return 0;
}

结果如下:

3 hot
5 bloom
1 aaaa

hot

unordered_setunordered_mapunordered_multisetunordered_multimap的用法和之前的有序容器类似,只是元素存储时无序,查找效率高

猜你喜欢

转载自blog.csdn.net/qq_41140138/article/details/109125824