map和set的区别在于,前者key和value是分开的,前者的key不会重复,value可以重复;后者的key即为value,后者的value不允许重复。还有,map在插入时可以使用 [ ]进行(看插入时代码),其采用了看起来像是数组插值的方法进行元素的插入。

例程

  1. #include<stdexcept>
  2. #include<string>
  3. #include<cstdlib>
  4. #include<cstdio>
  5. #include<algorithm>
  6. #include<iostream>
  7. #include<ctime>
  8. #include<map>
  9. using namespace std;
  10. long get_a_target_long()
  11. {
  12. long target = 0;
  13. cout<<"target(0~"<<RAND_MAX<<"):";
  14. cin>>target;
  15. return target;
  16. }
  17. string get_a_target_string()
  18. {
  19. long target = 0;
  20. char buf[10];
  21. cout<<"target(0~"<<RAND_MAX<<"):";
  22. cin>>target;
  23. snprintf(buf, 10, "%ld", target);
  24. return string(buf);
  25. }
  26. int compareLongs(const void* a, const void* b)
  27. {
  28. return (*(long*)a - *(long*)b);
  29. }
  30.  
  31. int compareStrings(const void *a, const void *b)
  32. {
  33. if(*(string*)a > *(string*)b)
  34. return 1;
  35. else if(*(string*)a < *(string*)b)
  36. return -1;
  37. else
  38. return 0;
  39. }
  40. void test_map(long& value)
  41. {
  42. cout << "\ntest_map().......... \n";
  43.  
  44. map<long, string> c;
  45. char buf[10];
  46.  
  47. clock_t timeStart = clock();
  48. for(long i=0; i< value; ++i)
  49. {
  50. try
  51. {
  52. snprintf(buf, 10, "%d", rand());
  53. c[i] = string(buf); //表现上像是数组插入值,实际上在其内部会自动将i 和 buf 合成为一个pair进行插入
  54. }
  55. catch(exception& p)
  56. {
  57. cout << "i=" << i << " " << p.what() << endl;
  58. abort();
  59. }
  60. }
  61. cout << "milli-seconds : " << (clock()-timeStart) << endl;
  62. cout << "map.size()= " << c.size() << endl; //元素个数
  63. cout << "map.max_size()= " << c.max_size() << endl;
  64.  
  65. long target = get_a_target_long();
  66. timeStart = clock();
  67. auto pItem = c.find(target);
  68. cout << "c.find(), milli-seconds : " << (clock()-timeStart) << endl;
  69. if (pItem != c.end())
  70. cout << "found, value=" << (*pItem).second << endl;
  71. else
  72. cout << "not found! " << endl;
  73. }
  74. int main()
  75. {
  76. long int value;
  77. cout<<"how many elements: ";
  78. cin>>value;
  79. test_map(value);
  80. return 0;
  81. }

运行结果

容器之分类与各种测试(四)——map的更多相关文章

  1. 容器之分类与各种测试(四)——unordered_set和unordered_map

    关于set和map的区别前面已经说过,这里仅是用hashtable将其实现,所以不做过多说明,直接看程序 unordered_set #include<stdexcept> #includ ...

  2. 容器之分类与各种测试(四)——unordered-multiset

    unordered-multiset是不定序关联式容器,其底部是通过哈希表实现功能. (ps:黑色框就是bucket,白色框即为bucket上挂载的元素) 为了提高查找效率,bucket(篮子)的数量 ...

  3. 容器之分类与各种测试(四)——multimap

    multiset和multimap的具体区别在于,前者的key值就是自己存储的value,后者的key与value是分开的不相关的. 例程 #include<stdexcept> #inc ...

  4. 容器之分类与各种测试(四)——multiset

    multiset是可重复关键字的关联式容器,其与序列式容器相比最大的优势在于其查找效率相当高.(牺牲空间换取时间段) 例程 #include<stdexcept> #include< ...

  5. 容器之分类与各种测试(四)——set

    set和multiset的去别在于前者的key值不可以重复,所以用随机数作为其元素进行插入时,遇到重复元素就会被拒绝插入(但是程序不会崩溃). 例程 #include<stdexcept> ...

  6. 容器之分类与各种测试(四)——unordered-multimap

    unordered-multiset与unordered-multimap的区别和multiset与multimap的区别基本相同,所以在定义和插入时需要注意 key-value 的类型. 例程 #i ...

  7. 容器之分类与各种测试(三)——stack

    stack是栈,其实现也是使用了双端队列(只要不用双端队列的一端,仅用单端数据进出即完成单端队列的功能),由于queue和stack的实现均是使用deque,没有自己的数据结构和算法,所以这俩也被称为 ...

  8. 容器的分类与各种测试(三)——deque

    deque是双端队列,其表象看起来是可以双端扩充,但实际上是通过内存映射管理来营造可以双端扩充的假象,如图所示 比如,用户将最左端的buff用光时,map会自动向左扩充,继续申请并映射一个新的buff ...

  9. 容器的分类与各种测试(二)——vector部分用法

    向量 vector 是一种对象实体, 能够容纳许多其他类型相同的元素, 因此又被称为容器. 与string相同, vector 同属于STL(Standard Template Library, 标准 ...

随机推荐

  1. poj 2724 Purifying Machine(二分图最大匹配)

    题意: 有2^N块奶酪,编号为00...0到11..1. 有一台机器,有N个开关.每个开关可以置0或置1,或者置*.但是规定N个开关中最多只能有一个开关置*. 一旦打开机器的开关,机器将根据N个开关的 ...

  2. zabbix部署文档

    环境:zabbix server centos 7 1611最小化安装 172.16.103.2 zabbix client Centos 7 1611 最小化安装 172.16.103.3 1,配置 ...

  3. Kubernetes Deployment 源码分析(二)

    概述startDeploymentController 入口逻辑DeploymentController 对象DeploymentController 类型定义DeploymentController ...

  4. 模块化开发 | es6模块暴露与引入

    CommonJS模块开发 CommonJS定义 每个文件就一个模块,有自己的作用域.在一个文件里面定义的变量.函数.类,都是私有的,对其他文件不可见. 私有作用域不会污染全局作用域. 模块可加载多次, ...

  5. 1. 处理静态资源 2. controller如何接受请求得参数 3. 如何把controller得数据保存到view. 4. 在controller如何完成重定向到指定路径 5. controller返回json数据

    1. 1. 处理静态资源2. controller如何接受请求得参数3. 如何把controller得数据保存到view.4. 在controller如何完成重定向到指定路径5. controller ...

  6. flask gevent

    flask的不同部署方式 使用gevent部署,只是在不同请求之间是异步的,同一个请求之间还是串行的. https://iximiuz.com/en/posts/flask-gevent-tutori ...

  7. Navicat15最新版本破解 亲测可用!!!(Navicat Premium 注册出现 No All Pattern Found! File Already Patched)

    1.下载Navicat Premium官网https://www.navicat.com.cn/下载最新版本下载安装 2.本人网盘链接:https://pan.baidu.com/s/1ncSaxId ...

  8. sql关联修改

    UPDATE  p  set p.ClientID = c.id  from PaymentTable p left JOIN ClientTable c on p.ClientID = c.Clie ...

  9. Ubuntu安装BCC

    Ubuntu安装BCC 教程 官方文档 安装 这里官方文档中首先讲到的是二进制文件的安装,直接通过apt进行安装 sudo apt-get install bpfcc-tools linux-head ...

  10. 面向政务企业的开发者工具集-逐浪文本大师v0.1正式发布(含代码全部开源啦!)

    这是一款基于.net 4.7环境开发的开发者工具. 一个实用的windows小工具集合,里面包含了多个常用的小软件.其中的批量修改文件名及文件内容功能,可以自定义修改规则,支持规则的导入与导出.不需要 ...