C++ set 、unordered_set
C++中set的特性:set的元素不像map那样可以同时拥有实值(value)和键值(key),set元素的键值就是实值,实值就是键值;set的所有元素都会根据元素的键值(值)自动排序;set不允许两个元素有相同的键值,在set中每个元素的值都唯一。set中数元素的值不能直接被改变。C++ STL中标准关联容器set,multiset,map,multimap采用平衡检索二叉树(红黑树)实现。红黑
·
C++中set的特性:
- set的元素不像map那样可以同时拥有实值(value)和键值(key),set元素的键值就是实值,实值就是键值;
- set的所有元素都会根据元素的键值(值)自动排序;
- set不允许两个元素有相同的键值,在set中每个元素的值都唯一。
- set中数元素的值不能直接被改变。
- C++ STL中标准关联容器set,multiset,map,multimap采用平衡检索二叉树(红黑树)实现。
- 红黑树又叫RB树(Red-Black Tree),RB树的统计性能要好于一般平衡二叉树,所以被STL选作关联容器的内部结构。
C++中set的成员函数:
- begin()--返回指向第一个元素的迭代器
- clear()--清除所有元素
- count()--返回某个值元素的个数
- empty()--如果集合为空,返回true
- end()--返回指向最后一个元素的迭代器
- equal_range()--返回集合中与给定值相等的上下限的两个迭代器
- erase()--删除集合中的元素
- find()--返回一个指向被查找到元素的迭代器
- get_allocator()--返回集合的分配器
- insert()--在集合中插入元素
- lower_bound()--返回指向大于(或等于)某值的第一个元素的迭代器
- key_comp()--返回一个用于元素间值比较的函数
- max_size()--返回集合能容纳的元素的最大限值
- rbegin()--返回指向集合中最后一个元素的反向迭代器
- rend()--返回指向集合中第一个元素的反向迭代器
- size()--集合中元素的数目
- swap()--交换两个集合变量
- upper_bound()--返回大于某个值元素的迭代器
- value_comp()--返回一个用于比较元素间的值的函数
unordered_set
(1)C++ 11中出现的两种新关联容器: unordered_set和unordered_map,其内部实现与set和map大有不同:
- set和map内部实现是基于RB-Tree;
- unordered_set和unordered_map内部实现是基于哈希表(hashtable);
- unordered_set和unordered_map内部实现的公共接口大致相同。
(2)
- unordered_set是基于哈希表,哈希表是根据关键码值进行直接访问的数据结构,通过相应的哈希函数(也称散列函数)处理关键字得到相应的关键码值,关键码值对应着一个特定位置,用该位置来存取相应的信息,以较快的速度获取关键字的信息。
- C++ 11中的无序集合容器(unordered_set)是一个存储不重复值(unique,即无重复)的关联容器(Associative container),容器中的元素无特别的秩序关系,且该容器允许基于值的快速元素检索,同时也支持正向迭代。
- 在一个unordered_set内部,元素不会按任何顺序排序,而是通过元素值的hash值将元素分组放置到各个槽(Bucker,也可以译为“桶”),这样就能通过元素值快速访问各个对应的元素(均摊耗时为O(1))。
- 原型中的Key代表要存储的类型,而hash<Key>也就是你的hash函数,equal_to<Key>用来判断两个元素是否相等,allocator<Key>是内存的分配策略。一般情况下,我们只关心hash<Key>和equal_to<Key>参数。
- unordered_set和set不可以重复,unordered_multiset和multiset可以重复。
- unordered_set是一种无序集合,底层实现基于hash table,拥有快速的查找、删除、添加的优点,基于hash table所以失去了基于rb_tree的自动排序功能,unordered_set无序,所以在迭代器的使用上,set的效率会高于unordered_set。
(3)用法
//一 定义
unordered_set<int> c1; //定义
unordered_set<int> c2;
c2 = c1; //重载了:operator=
//二 容量操作
c1.empty(); //判断是否为空
c1.size(); //获取元素个数
c1.max_size();//获取最大存储量
//三 迭代器操作
unordered_set<int>::iterator ite_begin = c1.begin(); //返回头迭代器 begin()
unordered_set<int>::iterator ite_end = c1.end();//返回尾迭代器 end()
unordered_set<int>::const_iterator const_ite_begin = c1.cbegin();//返回const头迭代器
unordered_set<int>::const_iterator const_ite_end = c1.cend();//返回const尾迭代器
unordered_set<int>::local_iterator local_iter_begin = c1.begin(1);//槽迭代器
unordered_set<int>::local_iterator local_iter_end = c1.end(1);//槽迭代器
//四 基本操作
unordered_set<int>::iterator find_iter = c1.find(1);//查找函数 find() 通过给定主键查找元素
c1.count(1);//value出现的次数count(), 返回匹配给定主键的元素的个数
//返回元素在哪个区域equal_range() 返回值匹配给定搜索值的元素组成的范围
pair<unordered_set<int>::iterator, unordered_set<int>::iterator> pair_equal_range = c1.equal_range(1);
c1.emplace(1); //插入函数 emplace()
c1.emplace_hint(ite_begin, 1); //插入函数emplace_hint()使用迭代器
c1.insert(1); //插入函数 insert()
c1.erase(1); //1.迭代器 value区域, 删除erase()
c1.clear(); //清空 clear()
c1.swap(c2); //交换 swap()
//五 篮子操作
c1.bucket_count(); //篮子操作 篮子个数 bucket_count() 返回槽(Bucket)数
c1.max_bucket_count(); //篮子最大数量 max_bucket_count() 返回最大槽数
c1.bucket_size(3); //篮子个数 bucket_size() 返回槽大小
c1.bucket(1); //返回篮子 bucket() 返回元素所在槽的序号
c1.load_factor(); //load_factor返回载入因子,即一个元素槽(Bucket)的最大元素数
c1.max_load_factor(); //max_load_factor返回或设置最大载入因子
//六 内存操作
c1.rehash(1); //rehash设置槽数
c1.reserve(1000); //reserve请求改变容器容量
//七 hash func
auto hash_func_test = c1.hash_function();//hash_function()返回与hash_func相同功能的函数指针
auto key_eq_test = c1.key_eq();//key_eq()返回比较key值得函数指针
参考:https://blog.csdn.net/xiaoqiaxiaoqi/article/details/80531742
更多推荐
所有评论(0)