set与hash_set

原文:http://blog.csdn.net/morewindows/article/details/7029587

STL系列之六 set与hash_set

set和hash_set是STL中比较重要的容器,有必要对其进行深入了解。在STL中,set是以红黑树(RB-tree)作为底层数据结构的,hash_set是以Hash table(哈希表)作为底层数据结构的。set可以在时间复杂度为O(logN)情况下插入、删除和查找数据。hash_set操作的时间复杂度则比较复杂,这取决于哈希函数和哈希表的负载情况。下面列出set和hash_set的常用函数:

set和hase_set的更多函数请查阅MSDN

set的使用范例如下(hash_set类似):

[cpp] view plaincopy

  1. // by MoreWindows( http://blog.csdn.net/MoreWindows )
  2. #include <set>
  3. #include <ctime>
  4. #include <cstdio>
  5. using namespace std;
  6. int main()
  7. {
  8. printf("--set使用 by MoreWindows( http://blog.csdn.net/MoreWindows ) --\n\n");
  9. const int MAXN = 15;
  10. int a[MAXN];
  11. int i;
  12. srand(time(NULL));
  13. for (i = 0; i < MAXN; ++i)
  14. a[i] = rand() % (MAXN * 2);
  15. set<int> iset;
  16. set<int>::iterator pos;
  17. //插入数据 insert()有三种重载
  18. iset.insert(a, a + MAXN);
  19. //当前集合中个数 最大容纳数据量
  20. printf("当前集合中个数: %d     最大容纳数据量: %d\n", iset.size(), iset.max_size());
  21. //依次输出
  22. printf("依次输出集合中所有元素-------\n");
  23. for (pos = iset.begin(); pos != iset.end(); ++pos)
  24. printf("%d ", *pos);
  25. putchar(‘\n‘);
  26. //查找
  27. int findNum = MAXN;
  28. printf("查找 %d是否存在-----------------------\n", findNum);
  29. pos = iset.find(findNum);
  30. if (pos != iset.end())
  31. printf("%d 存在\n", findNum);
  32. else
  33. printf("%d 不存在\n", findNum);
  34. //在最后位置插入数据,如果给定的位置不正确,会重新找个正确的位置并返回该位置
  35. pos  = iset.insert(--iset.end(), MAXN * 2);
  36. printf("已经插入%d\n", *pos);
  37. //删除
  38. iset.erase(MAXN);
  39. printf("已经删除%d\n", MAXN);
  40. //依次输出
  41. printf("依次输出集合中所有元素-------\n");
  42. for (pos = iset.begin(); pos != iset.end(); ++pos)
  43. printf("%d ", *pos);
  44. putchar(‘\n‘);
  45. return 0;
  46. }

运行结果如下:

时间: 2024-10-12 17:11:47

set与hash_set的相关文章

C++实现hash_set

头文件: #include<iostream> using namespace std; template<class hash_type> class hash_set { private: hash_type array[100000]; int hash_fun(hash_type original); public: hash_set();//构造函数 void insert(hash_type value);//插入一个元素 void erase(hash_type ta

第15章 hash_set哈希集合容器

/* 第15章 hash_set哈希集合容器   15.1 hash_set技术原理   15.2 hash_set应用基础   15.3 本章小结 略 */

hash_set 在g++下编译出现not declare的问题

今天在Ubuntu下写一个程序的时候用到了hash_set容器,出现一点问题,在这里记录一下,先说一下,hash_*系列例如hash_map,hash_set 等已经被废弃了,C++11用unordered_map,unordered_set等来替代,但是我用的g++ 4.6.1警告说C++11特性是实验性的,貌似到4.8才完全支持.所以就改用hash_set了,写了如下的程序: #include <iostream> #include <string> #include <

关联容器 — hash_set

容器hash_set是以hash table为底层机制的,几乎所有的操作都是转调用hash table提供的接口.由于插入无法存储相同的键值,所以hash_set的插入操作全部都使用hash table的insert_unique接口,代码如下: pair<iterator, bool> insert(const value_type& obj) { pair<typename ht::iterator, bool> p = rep.insert_unique(obj);

#include &lt;hash_set&gt;

哈希查找,不需要排序,适用于精确查找,比二分查找更快 1 #define _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS 2 #include <iostream> 3 #include <hash_set> 4 5 int main() 6 { 7 std::hash_set<const char *>hs;//哈希 8 9 hs.insert("china"); 10 hs.insert("abc&q

深入了解STL中set与hash_set,hash表基础

一,set和hash_set简介 在STL中,set是以红黑树(RB-Tree)作为底层数据结构的,hash_set是以哈希表(Hash table)作为底层数据结构的.set可以在时间复杂度为O(logN)的情况下插入,删除和查找数据.hash_set操作的时间度则比较复杂,取决于哈希函数和哈希表的负载情况. 二,SET使用范例(hash_set类似) 1 #include <set> 2 #include <ctime> 3 #include <cstdio> 4

set 和hash_set和海量数据的处理问题

什么样的结构决定其什么样的性质,因为set/map/multiset/multimap都是基于RB-tree之上,所以有自动排序功能, 而hash_set/hash_map/hash_multiset/hash_multimap都是基于hashtable之上,所以不含有自动排序功能,至于加个前缀multi_无非就是允许键值重复而已. 2.寻找热门查询:搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节.      假设目前有一千万个记录(这些查询串的

【STL】关联容器 — hash_set

容器hash_set是以hash table为底层机制的,差点儿所有的操作都是转调用hash table提供的接口.因为插入无法存储同样的键值,所以hash_set的插入操作所有都使用hash table的insert_unique接口,代码例如以下: pair<iterator, bool> insert(const value_type& obj) { pair<typename ht::iterator, bool> p = rep.insert_unique(obj

hash_set和hash_map

1.hash_set集合容器 hash_set利用链式哈希表,进行数据的插入.删除和搜索.与set容器相同,不允许插入重复键值的元素.SGIC++哈希表是一个链式的结构,由表头和一系列单链组成.表头是一个数组式的线性表,用vector向量泛化出来.每个表头节点,称为桶(bucket),是一个指针域,指向链入的元素数据.表头的长度为向量容器的元素个数. 哈希表中数据的遍历,迭代器从0号桶.1号桶.2号桶,······,逐一遍历每个桶中的所有元素数据. 哈希表的数据检索,是通过哈希函数,计算出数据所