没有傲慢也没有偏见

原创 2013年12月04日 22:22:08
     
    最近在跨平台编译项目的时候,遇到一个很有意思的问题,关于std::map.erase() 返回参数不一样,跨平台编译失败的问题。由于涉及到不同平台,不同标准的问题。可能很多不成熟的人又该喷微软不遵循标准,自做主张了,下面这篇文章就是为微软申冤的。

两个平台的标准:
查看c++文档发现删除迭代器函数
c++98 标准 erase返回void
c++11 标准 erase返回iterator
再看微软的文档:
http://msdn.microsoft.com/en-us/library/z2f3cb7h.aspx
和c++11 的标准是一样的

编译不过的示例代码:
std::map<int, string> player_map;
std::map<int, string>::iterator it = player_map.begin();
for(; it != player_map.end(); ){
    int id = it->first;
    if(id = 10001) {
         it = player_map.erase(it);
    }else{
         ++it;
    }
}
     在vs2008里编译没任何问题,到gcc里报没有=操作符。标准库循环内删除的代码:
std::map<int, string> player_map;
std::map<int, string>::iterator it = player_map.begin();
std::map<int, string>::iterator delIt = null;
for(; it != player_map.end();){
    delIt = it;
    ++it;
    int id = delIt->first;
    if(id = 10001) {
         player_map.erase(delIt);
    }
}

对标准库的评价:
     如果没有返回值,就需要提前将it复制出来,下面的代码明显没有上面的优美,所以微软的erase返回iter是对的。并且有下面优势:
  1. 保持了和其他stl  erase方法的一致性,不许要在多记一条特殊的方法
  2. 程序看起来更加优美,简洁
  3. 方便循环内删除
注意:
    循环内删除的时候,保证只做一件事情,这段代码的内聚性更高,同时如果在循环内删除的时候迭代器的递增会使得it == it.end(), 这时候引用了it,会导致程序发生不可预料的结果。

总结:
    通过上面的二段代码,发现返回下一个迭代器更加合理,因为在循环内删除,需要指向下次迭代器的值。从这些历史的变迁里,微软让我更加敬佩,他们没有盲目的去崇拜或者遵循权威,而是通过自己对技术的理解,修正了标准库的不足。而同样标准库也是知错能改,并没有因为自己的错误,或者自己订立标准库的便利,而固执不变。这正是我们做技术的应给学习的地方:不盲目权威,知错就改。

第7章 证据的效力如何

是什么类型的证据,可靠吗? 证据类型:直觉、个人经历、典型案例、当事人证词、权威或专家意见、个人观察、研究报告和类比 直觉 个人经历 会出现的问题 以偏概全谬误:一个人仅根据群体中极...
  • sinat_14889231
  • sinat_14889231
  • 2016年06月13日 11:47
  • 228

APIJSON-以坚持和偏执,回敬傲慢和偏见

APIJSON简介: APIJSON是一种JSON传输结构协议。 客户端可以定义任何JSON结构去向服务端发起请求,服务端就会返回对应结构的JSON字符串,所求即所得。 一次请求任意...
  • duzanuolu
  • duzanuolu
  • 2017年03月20日 18:42
  • 183

自我服务偏见

自我服务偏见(self serving bais)当我们加工和自我有关的信息时,会出现一种潜在的偏见,我们一边轻易地为自已的失败开脱,一边欣然接受成功的荣耀。...
  • lttclaw_
  • lttclaw_
  • 2014年12月28日 09:33
  • 556

交易偏见--《别做正常的傻瓜》摘记2

第二章 在消费过程中,正常人往往会受到交易效用偏见的影响,从而做出欠理性的消费决策行为。 合算交易偏见 交易效用,就是商品的参考价格和商品的实际价格之间的差额的效用。通俗点说,就是合算交易偏见。...
  • wangzengdi
  • wangzengdi
  • 2015年01月25日 10:26
  • 878

不确定性下的判断:启发法和偏见

代表性: 1.对结果的先验概率不敏感 2.对样本
  • pxm2525
  • pxm2525
  • 2014年09月30日 11:52
  • 1464

为什么这些java接口没有抽象方法?浅谈Java标记接口

爱Java 2016-10-22 17:42 在jdk的源码中,存在这样的一些接口,他们不包含任何的(抽象)方法,但是却广泛的存在。 这种接口我们称之为Mark Interface,也就是...
  • u011277123
  • u011277123
  • 2016年10月24日 09:09
  • 714

是的,大学没有同桌,我所在的学校也没有同桌

是的,大学没有同桌,我所在的学校也没有同桌。没有固定的同桌,也没有固定的教室,没有固定的老师,甚至可以说,连爱情也没有,至于自由,去他妈的吧,我只可以这么说了,因为你所向往的大学的美好,真的只是期望中...
  • w5476548
  • w5476548
  • 2014年06月19日 13:10
  • 52

也没有晚一步,就这样相逢了,也没有什么可说的,

http://dl.goufang.com/ershoufang-08308174.html http://dl.goufang.com/ershoufang-08308195.html http...
  • w2o385c3
  • w2o385c3
  • 2014年08月11日 03:45
  • 7

html5 中创建manifest缓存以及更新方法

测试环境和工具   chromium  18.0.1025.151 (开发编译版 130497 Linux) Ubuntu 11.04 一、测试内容          1.A页...
  • mincheat
  • mincheat
  • 2014年10月14日 09:43
  • 901

对各种语言的偏见

对各种语言的偏见 这大致是我编程语言的学习经历: 2003年学html/js2004年开始学C2004年学C++2005年学汇编和C#2007年学PHP2009年学Python2013年学...
  • wishfly
  • wishfly
  • 2016年11月16日 23:07
  • 527
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:没有傲慢也没有偏见
举报原因:
原因补充:

(最多只允许输入30个字)