一:无序容器简介

  1. Unordered Containers也是一种关联式容器。其中元素是分散,没有定性的排列(不是图中那样松散)。其中元素可能在某一次操作后改变原来的位置。

  1. 哈希表的链地址法,更能表现其内部实现结构。其中哈希表中表长可以改变,其实现用分配器实现,
    为了防止链表过程,效率减低,设置一个值,当链表长度过长时(大于等于表长),打散哈希表,重新设置表长,分配位置。

二:性能测试

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <iostream>
  3. #include <stdio.h>
  4. #include <cstring>
  5.  
  6. #if _MSC_VER
  7. #define snprintf _snprintf
  8. #endif
  9.  
  10. using namespace std;
  11.  
  12. long get_a_target_long()
  13. {
  14. /******变量声明********/
  15. long target = ;
  16. /**********************/
  17.  
  18. cout << "targer (0~" << RAND_MAX << "):";
  19. cin >> target;
  20. return target;
  21. }
  22.  
  23. string get_a_target_string()
  24. {
  25. /******变量声明********/
  26. long target = ;
  27. char buf[];
  28. /**********************/
  29.  
  30. cout << "targer (0~" << RAND_MAX << "):";
  31. cin >> target;
  32.  
  33. snprintf(buf, , "%d", target);
  34. return string(buf);
  35. }
  36.  
  37. //与后面的比较函数中回调参数对应
  38. int compareLongs(const void* l1, const void* l2)
  39. {
  40. return (*(long*)l1 - *(long*)l2);
  41. }
  42.  
  43. int compareStrings(const void* s1, const void* s2)
  44. {
  45. if (*(string*)s1 > *(string*)s2)
  46. return ;
  47. if (*(string*)s1 < *(string*)s2)
  48. return -;
  49. return ;
  50. }

公共函数

(一)unordered_multiset测试

  1. #include <unordered_set>
  2. //测试unordered_multiset-->元素可以重复
  3. namespace jj12
  4. {
  5. void test_unordered_multiset(long& us_size)
  6. {
  7. cout << "\ntest_unordered_multiset()*******" << endl;
  8.  
  9. /******变量声明:数组初始********/
  10. char buf[];
  11.  
  12. /******变量声明:unordered_multiset初始********/
  13. unordered_multiset<string> ums;
  14.  
  15. /******变量声明:记录时间********/
  16. clock_t timeStart = clock(); //开始时间
  17. for (long i = ; i < us_size; i++)
  18. {
  19. try
  20. {
  21. snprintf(buf, , "%d", rand());
  22. ums.insert(string(buf));
  23. }
  24. catch (exception& e)
  25. {
  26. cout << e.what() << endl;
  27. cout << "Max_size:" << i << endl;
  28. abort(); //终止
  29. }
  30. }
  31.  
  32. cout << "inti unordered_multiset use milli-seconds:" << (clock() - timeStart) << endl; //获取初始化数组耗时
  33. cout << "unordered_multiset.size:" << ums.size() << endl; //获取unordered_multiset大小
  34. cout << "unordered_multiset.max_size:" << ums.max_size() << endl; //获取unordered_multiset允许最大长度
  35. cout << "unordered_multiset.bucket_count:" << ums.bucket_count() << endl; //获取篮子数--表长
  36. cout << "unordered_multiset.load_factor:" << ums.load_factor() << endl; //获取加载因子
  37. cout << "unordered_multiset.max_load_factoe:" << ums.max_load_factor() << endl; //获取最大加载因子--1
  38. cout << "unordered_multiset.max_bucket_count:" << ums.max_bucket_count() << endl; //获取存在最大篮子数--表长
  39.  
  40. //打印前20个篮子
  41. for (int i = ; i < ; i++)
  42. cout << "Key #" << i << " has " <<
  43. ums.bucket_size(i) //该篮子中有几个元素
  44. << " elements" << endl;
  45.  
  46. /******变量声明:获取我们要查询的数********/
  47. string target = get_a_target_string();
  48.  
  49. //使用::find方法进行查找
  50. timeStart = clock();
  51.  
  52. auto pI = find(ums.begin(), ums.end(), target);
  53.  
  54. cout << "::find(),milli-seconds:" << clock() - timeStart << endl;
  55. if (pI != ums.end())
  56. cout << "found:" << *pI << endl;
  57. else
  58. cout << "not found!" << endl;
  59.  
  60. //使用unordered_multiset.find查找
  61. timeStart = clock();
  62.  
  63. pI = ums.find(target); //比::find块得多,直接定位查询,
  64.  
  65. cout << "unordered_multiset.find(),milli-seconds:" << clock() - timeStart << endl;
  66. if (pI != ums.end())
  67. cout << "found:" << *pI << endl;
  68. else
  69. cout << "not found!" << endl;
  70.  
  71. }
  72. }

(二)unordered_multimap测试

  1. #include <unordered_map>
  2. //测试unordered_multimap-->元素可以重复
  3. namespace jj13
  4. {
  5. void test_unordered_multimap(long& mm_size)
  6. {
  7. cout << "\ntest_unordered_multimap()*******" << endl;
  8.  
  9. /******变量声明:数组初始********/
  10. char buf[];
  11.  
  12. /******变量声明:unordered_multimap初始********/
  13. unordered_multimap<long, string> umm;
  14.  
  15. /******变量声明:记录时间********/
  16. clock_t timeStart = clock(); //开始时间
  17. for (long i = ; i < mm_size; i++)
  18. {
  19. try
  20. {
  21. snprintf(buf, , "%d", rand());
  22. umm.insert(pair<long, string>(i, string(buf)));
  23. }
  24. catch (exception& e)
  25. {
  26. cout << e.what() << endl;
  27. cout << "Max_size:" << i << endl;
  28. abort(); //终止
  29. }
  30. }
  31.  
  32. cout << "inti unordered_multimap use milli-seconds:" << (clock() - timeStart) << endl; //获取初始化数组耗时
  33. cout << "unordered_multimap.size:" << umm.size() << endl; //获取unordered_multimap大小
  34. cout << "unordered_multimap.max_size:" << umm.max_size() << endl; //获取unordered_multimap所允许最大
  35. cout << "unordered_multimap.bucket_count:" << umm.bucket_count() << endl; //获取篮子数--表长
  36. cout << "unordered_multimap.load_factor:" << umm.load_factor() << endl; //获取加载因子
  37. cout << "unordered_multimap.max_load_factoe:" << umm.max_load_factor() << endl; //获取最大加载因子--1
  38. cout << "unordered_multimap.max_bucket_count:" << umm.max_bucket_count() << endl; //获取存在最大篮子数--表长
  39.  
  40. //打印前20个篮子
  41. for (int i = ; i < ; i++)
  42. cout << "Key #" << i << " has " <<
  43. umm.bucket_size(i) //该篮子中有几个元素
  44. << " elements" << endl;
  45.  
  46. /******变量声明:获取我们要查询的数********/
  47. long target = get_a_target_long(); //根据key查找
  48.  
  49. //unordered_multimap没有全局::find方法可用,::find找值,multimap找键,两者不同,不可以混用
  50.  
  51. //使用unordered_multimap.find查找
  52. timeStart = clock();
  53.  
  54. auto pI = umm.find(target);
  55.  
  56. cout << "unordered_multimap.find(),milli-seconds:" << clock() - timeStart << endl;
  57. if (pI != umm.end())
  58. cout << "found:" << (*pI).first << ":" << (*pI).second << endl;
  59. else
  60. cout << "not found!" << endl;
  61.  
  62. }
  63. }

(三)unordered_set测试

  1. #include <unordered_set>
  2. //测试unordered_set-->元素不可以重复
  3. namespace jj14
  4. {
  5. void test_unordered_set(long& us_size)
  6. {
  7. cout << "\ntest_unordered_set()*******" << endl;
  8.  
  9. /******变量声明:数组初始********/
  10. char buf[];
  11.  
  12. /******变量声明:unordered_set初始********/
  13. unordered_set<string> us;
  14.  
  15. /******变量声明:记录时间********/
  16. clock_t timeStart = clock(); //开始时间
  17. for (long i = ; i < us_size; i++)
  18. {
  19. try
  20. {
  21. snprintf(buf, , "%d", rand());
  22. us.insert(string(buf));
  23. }
  24. catch (exception& e)
  25. {
  26. cout << e.what() << endl;
  27. cout << "Max_size:" << i << endl;
  28. abort(); //终止
  29. }
  30. }
  31.  
  32. cout << "inti unordered_multiset use milli-seconds:" << (clock() - timeStart) << endl; //获取初始化数组耗时
  33. cout << "unordered_set.size:" << us.size() << endl; //获取unordered_set大小
  34. cout << "unordered_set.max_size:" << us.max_size() << endl; //获取unordered_set允许最大
  35. cout << "unordered_set.bucket_count:" << us.bucket_count() << endl; //获取篮子数--表长
  36. cout << "unordered_set.load_factor:" << us.load_factor() << endl; //获取加载因子
  37. cout << "unordered_set.max_load_factoe:" << us.max_load_factor() << endl; //获取最大加载因子--1
  38. cout << "unordered_set.max_bucket_count:" << us.max_bucket_count() << endl; //获取存在最大篮子数--表长
  39.  
  40. //打印前20个篮子
  41. for (int i = ; i < ; i++)
  42. cout << "Key #" << i << " has " <<
  43. us.bucket_size(i) //该篮子中有几个元素
  44. << " elements" << endl;
  45.  
  46. /******变量声明:获取我们要查询的数********/
  47. string target = get_a_target_string();
  48.  
  49. //使用::find方法进行查找
  50. timeStart = clock();
  51.  
  52. auto pI = find(us.begin(), us.end(), target);
  53.  
  54. cout << "::find(),milli-seconds:" << clock() - timeStart << endl;
  55. if (pI != us.end())
  56. cout << "found:" << *pI << endl;
  57. else
  58. cout << "not found!" << endl;
  59.  
  60. //使用unordered_set.find查找
  61. timeStart = clock();
  62.  
  63. pI = us.find(target); //比::find块得多,直接定位查询,
  64.  
  65. cout << "unordered_set.find(),milli-seconds:" << clock() - timeStart << endl;
  66. if (pI != us.end())
  67. cout << "found:" << *pI << endl;
  68. else
  69. cout << "not found!" << endl;
  70.  
  71. }
  72. }

(四)unordered_map测试

  1. #include <unordered_map>
  2. //测试unordered_map-->元素不可以重复
  3. namespace jj15
  4. {
  5. void test_unordered_map(long& um_size)
  6. {
  7. cout << "\ntest_unordered_map()*******" << endl;
  8.  
  9. /******变量声明:数组初始********/
  10. char buf[];
  11.  
  12. /******变量声明:unordered_multimap初始********/
  13. unordered_map<long, string> um;
  14.  
  15. /******变量声明:记录时间********/
  16. clock_t timeStart = clock(); //开始时间
  17. for (long i = ; i < um_size; i++)
  18. {
  19. try
  20. {
  21. snprintf(buf, , "%d", rand());
  22. um.insert(pair<long, string>(i, string(buf)));
  23. }
  24. catch (exception& e)
  25. {
  26. cout << e.what() << endl;
  27. cout << "Max_size:" << i << endl;
  28. abort(); //终止
  29. }
  30. }
  31.  
  32. cout << "inti unordered_map use milli-seconds:" << (clock() - timeStart) << endl; //获取初始化数组耗时
  33. cout << "unordered_map.size:" << um.size() << endl; //获取unordered_map大小
  34. cout << "unordered_map.max_size:" << um.max_size() << endl; //获取unordered_map允许最大
  35. cout << "unordered_map.bucket_count:" << um.bucket_count() << endl; //获取篮子数--表长
  36. cout << "unordered_map.load_factor:" << um.load_factor() << endl; //获取加载因子
  37. cout << "unordered_map.max_load_factoe:" << um.max_load_factor() << endl; //获取最大加载因子--1
  38. cout << "unordered_map.max_bucket_count:" << um.max_bucket_count() << endl; //获取存在最大篮子数--表长
  39.  
  40. //打印前20个篮子
  41. for (int i = ; i < ; i++)
  42. cout << "Key #" << i << " has " <<
  43. um.bucket_size(i) //该篮子中有几个元素
  44. << " elements" << endl;
  45.  
  46. /******变量声明:获取我们要查询的数********/
  47. long target = get_a_target_long(); //根据key查找
  48.  
  49. //unordered_map没有全局::find方法可用,::find找值,unordered_map找键,两者不同,不可以混用
  50.  
  51. //使用unordered_map.find查找
  52. timeStart = clock();
  53.  
  54. auto pI = um.find(target);
  55.  
  56. cout << "unordered_map.find(),milli-seconds:" << clock() - timeStart << endl;
  57. if (pI != um.end())
  58. cout << "found:" << (*pI).first << ":" << (*pI).second << endl;
  59. else
  60. cout << "not found!" << endl;
  61.  
  62. }
  63. }

10--STL无序容器(Unordered Containers)的更多相关文章

  1. C++ 标准模板库(STL)——容器(Containers)的用法及理解

    C++ 标准模板库(STL)中定义了通用的模板类和函数,这些模板类和函数可以实现多种流行和常用的算法和数据结构,如向量(vector).队列(queue).栈(stack).set.map等.这次主要 ...

  2. STL学习笔记— —无序容器(Unordered Container)

    简单介绍 在头文件<unordered_set>和<unordered_map> 中定义 namespace std { template <typename T, ty ...

  3. STL基础--容器

    容器种类 序列容器(数组,链表) Vector, deque, list, forward list, array 关联容器(二叉树),总是有序的 set, multiset根据值排序,元素值不能修改 ...

  4. STL之容器基本操作

    容器类 STL Container Header Applications vector <vector> 直接访问任意元素,快速插入.删除尾部元素 deque <deque> ...

  5. [C++ STL] 各容器简单介绍

    什么是STL? 1.STL(Standard Template Library),即标准模板库,是一个高效的C++程序库. 2.包含了诸多常用的基本数据结构和基本算法.为广大C++程序员们提供了一个可 ...

  6. STL List容器

    转载http://www.cnblogs.com/fangyukuan/archive/2010/09/21/1832364.html 各个容器有很多的相似性.先学好一个,其它的就好办了.先从基础开始 ...

  7. c++复习:STL之容器

    1 STL的string 1 String概念 string是STL的字符串类型,通常用来表示字符串.而在使用string之前,字符串通常是用char*表示的.string与char*都可以用来表示字 ...

  8. C++ STL bitset 容器详解

    C++ STL bitset 容器详解 本篇随笔讲解\(C++STL\)中\(bitset\)容器的用法及常见使用技巧. \(bitset\)容器概论 \(bitset\)容器其实就是个\(01\)串 ...

  9. 详解C++ STL set 容器

    详解C++ STL set 容器 本篇随笔简单介绍一下\(C++STL\)中\(set\)容器的使用方法及常见使用技巧. set容器的概念和性质 \(set\)在英文中的意义是:集合.\(set\)容 ...

随机推荐

  1. FM系列

    在计算广告中,CTR是非常重要的一环.对于特征组合来说,业界通用的做法主要有两大类:FM系列和Tree系列.这里我们来介绍一下FM系列. 在传统的线性模型中,每个特征都是独立的,如果需要考虑特征与特征 ...

  2. 胡搞-强化版的light oj-1055-的思路-AI版的6重暴力For循环的BFS

    新题目大意: 三个棋子按照先后顺序,可以随意方向合法地走到空位置上(而不是像原题light oj-1055中的一样三个棋子每次走的方向都一致),当三个棋子全部走进目标地点,就结束:求需要指挥的最少次数 ...

  3. Return local beginning of day time object in Go

    Both the title and the text of the question asked for "a local [Chicago] beginning of today tim ...

  4. P1736 创意吃鱼法[二维dp]

    题目背景 感谢@throusea 贡献的两组数据 题目描述 回到家中的猫猫把三桶鱼全部转移到了她那长方形大池子中,然后开始思考:到底要以何种方法吃鱼呢(猫猫就是这么可爱,吃鱼也要想好吃法 ^_*).她 ...

  5. 为什么要设置HTTP timeout?

    先看一个不设置timeout造成的线上事故. 一次线上事故 有一次生产上的一个服务出了点故障,一个原本每5分钟执行一次的定时任务突然不执行了.第一反应是任务执行报错,查看日志,却没有找到任何异常报错信 ...

  6. 14 Vue列表渲染

    列表渲染 用 v-for 把一个数组对应为一组元素(for循环) 我们可以用 v-for 指令基于一个数组来渲染一个列表. v-for 指令需要使用 item in items 形式的特殊语法, 其中 ...

  7. [Javascript] Construct a Regex to Match Twitter Mentions with Regexr

    regexr is a powerful tool for debugging existing regexes and creating new ones. In this lesson, we'l ...

  8. java调出cmd窗口长ping某个ip

    package lct.conference.test; import java.io.IOException; public class Test { public static void main ...

  9. KMP解决字符串最小循环节相关问题

    经典问题 : 给出一个由某个循环节构成的字符串,要你找出最小的循环节,例如 abababab 最小循环节当是 ab ,而类似 abab 也可以成为它的循环节,但并非最短. 分析 : 对于上述问题有两个 ...

  10. 代码编辑器——Visual Studio Code

    一.介绍 Visual Studio Code(简称 VS Code / VSC) 是一款免费开源的现代化轻量级代码编辑器,支持几乎所有主流的开发语言的语法高亮.智能代码补全.自定义热键.括号匹配.代 ...