当前位置: 首页 > news >正文

西安网评论seo企业推广案例

西安网评论,seo企业推广案例,外贸平台有哪些比较好 免费,站长工具之家我目前手头上的项目,需要编译在板端Linux上运行,但是日常daily调试多在Windows上开发。这就涉及到同一份代码在多平台上的编译个运行。有一次遇到了一个奇怪的现象:跑同样的一份代码,Windows和Linux出来的结果是不一致的。最终确定…

我目前手头上的项目,需要编译在板端Linux上运行,但是日常daily调试多在Windows上开发。这就涉及到同一份代码在多平台上的编译个运行。有一次遇到了一个奇怪的现象:跑同样的一份代码,Windows和Linux出来的结果是不一致的。最终确定到不一致的原因出现在unordered_map上,就把这次记录总结下来。

这次不一致发生在:处理一个状态序列的投票操作。从编程的角度而言,最适合投票操作的容器就是键值对,key放置投票的内容,value放置投票的次数。在C++中,STL提供了两个相关容器:map和unordered_map。在代码上选择了unordered_map来实现。


问题复现

我把这个问题简化:假设车的类型有四种情况,分别为UNKNOWN、SMALL、MIDDLE、BIG。现有15次的估计,以出现次数最多的类型作为其最终类型。代码非常简单:

#include <iostream>
#include <unordered_map>
#include <string>int main()
{std::unordered_map<std::string, int> vehs;vehs["UNKNOWN"] = 5;vehs["SMALL"] = 3;vehs["MIDDLE"] = 5;vehs["BIG"] = 2;std::string max_type;int max_times = -1;auto iter = vehs.begin();for (; iter != vehs.end(); ++iter) {if (iter->second > max_times) {max_times = iter->second;max_type = iter->first;}std::cout << iter->first << " ";}std::cout << std::endl;std::cout << "max_type : " << max_type << std::endl;return 0;
}

在Windows平台下,编译并运行代码:

BIG UNKNOWN SMALL MIDDLE
max_type : UNKNOWN

在Linux平台下,编译并运行代码:

BIG MIDDLE SMALL UNKNOWN
max_type : MIDDLE

可以看到,在Windows和Linux两个平台下的运行结果中,出现次数最多的车的类型,一个为UNKNOWN,一个为MIDDLE。主要原因是这两种类型都是5次(最多)。这时,unordered_map的遍历顺序就很重要了,这将直接关系到最终的输出结果。通过打印结果可以看到,两个平台下的遍历顺序是不一致的。

在C++中,STL提供了两个键值对容器:map和unordered_map。上面的代码,采用的是unordered_map容器,如果将其改成map容器呢?还会发生这种不一致的结果么?

std::map<std::string, int> vehs;    // 将unordered_map修改为map

此时再在Windows和Linux平台下,分别编译并运行代码,最终的输出都是一致的:

BIG MIDDLE SMALL UNKNOWN
max_type : MIDDLE

也就是说,这种平台不一致性只发生在unordered_map容器上,而不发生在map容器上


原因分析

map和unordered_map分别在Windows和Linux上的不同运行结果,主要体现在遍历顺序上。对于map而言,两个平台上的遍历顺序是一致的;而对于unordered_map而言,两个平台上的遍历顺序是不一致的。

遍历顺序的不同,究其根本,主要体现在其内部构造的不同

map的内部构造:

  • map的内部实现了一个红黑树(红黑树是非严格平衡二叉搜索树,而AVL是严格平衡二叉搜索树),红黑树具有自动排序的功能,因此map内部的所有元素都是有序的。红黑树的每一个节点都代表着map的一个元素。因此,对于map进行的查找,删除,添加等一系列的操作都相当于是对红黑树进行的操作。

unordered_map的内部构造:

  • unordered_map的内部实现了一个哈希表(也叫散列表,通过把关键码值映射到Hash表中一个位置来访问记录,查找的时间复杂度可达到O(1),其在海量数据处理中有着广泛应用)。因此,其元素的排列顺序是无序的。

两者在运行效率和占用内存的对比:

  • 运行效率方面:unordered_map最高,而map效率较低,但提供了稳定效率和有序的序列
  • 占用内存方面:map内存占用略低,unordered_map内存占用略高,而且是线性成比例的

需要无序容器,快速查找删除,不担心略高的内存时可以选择unordered_map;需要有序容器稳定查找删除效率,内存很在意时候用map。

因此,如果需要使用map,那么key需要定义operator<,用于进行有序的排序;如果需要使用unordered_map,那么key需要定义hash_value函数并且定义operator==,用于hash值的计算。而:

  • 当使用map时,Windows和Linux对于operator<的定义都是一致的
  • 当使用unordered_map时,Windows和Linux对于operator==的定义都是一致的,对于hash_value函数的定义是不一致的

从而,在使用unordered_map时,Windows和Linux使用两种不同的哈希函数,产生不同的哈希码,从而依次产生不同的存储区放置,导致在迭代时产生不同的顺序


相关阅读

  • c++ - Windows 和 Linux 上 std::unordered_map 容器的不同行为
http://www.dinnco.com/news/27384.html

相关文章:

  • wordpress投稿验证码灯塔网站seo
  • 黑龙江网站建设工作室沈阳seo优化排名公司
  • 外贸用什么网站好苏州seo关键词优化外包
  • 网站建设能干什么郑州网络营销
  • 网站建设课程设计百度文库小璇seo优化网站
  • 泉州seo建站网推项目接单平台
  • 北太平庄做网站公司郑州百度推广哪家好
  • 江西网站建设费用网络销售推广是做什么的具体
  • 高端大气企业网站模板seo关键词排名点击工具
  • 网站建设流程收费企业营销平台
  • 企业手机网站源码平台营销策略都有哪些
  • 商城网站html自己建网站流程
  • 在百度上建网站怎么建设网站优化排名哪家好
  • 手机付费咨询网站建设平台搭建
  • 做网站有的浏览器百度号码认证平台
  • 单页网站制作建站仿站淘宝网店运营
  • 呼伦贝尔市建设局网站百度销售
  • wordpress的cute主题破解最好的优化公司
  • 欧美做同志网站有哪些网络推广公司北京
  • 南昌网站建设 南昌做网站公司好口碑的关键词优化
  • 台州做网站seo湖人队最新消息
  • 建行信用卡网站登录磁力链搜索引擎入口
  • 简单的购物网站源码常州网站推广公司
  • 静态网页设计教程深圳百度搜索排名优化
  • 福安建设厅网站百度下载电脑版
  • 我市建设车辆违章查询网站 病句营销策划公司是干什么的
  • asp.net4.0动态网站开发seo关键词优化服务
  • 网站做的很差的案例营销网站建设规划
  • 微信链接的微网站怎么做的百度推广可以自己开户吗
  • 京东做代码的网站吗网盟推广是什么意思