没有傲慢也没有偏见
2013-12-04 22:22
176 查看
最近在跨平台编译项目的时候,遇到一个很有意思的问题,关于std::map.erase() 返回参数不一样,跨平台编译失败的问题。由于涉及到不同平台,不同标准的问题。可能很多不成熟的人又该喷微软不遵循标准,自做主张了,下面这篇文章就是为微软申冤的。
两个平台的标准:
查看c++文档发现删除迭代器函数
c++98 标准 erase返回void
c++11 标准 erase返回iterator
http://www.cplusplus.com/reference/map/map/erase/
再看微软的文档:
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是对的。并且有下面优势:
保持了和其他stl erase方法的一致性,不许要在多记一条特殊的方法
程序看起来更加优美,简洁
方便循环内删除
注意:
循环内删除的时候,保证只做一件事情,这段代码的内聚性更高,同时如果在循环内删除的时候迭代器的递增会使得it == it.end(), 这时候引用了it,会导致程序发生不可预料的结果。
总结:
通过上面的二段代码,发现返回下一个迭代器更加合理,因为在循环内删除,需要指向下次迭代器的值。从这些历史的变迁里,微软让我更加敬佩,他们没有盲目的去崇拜或者遵循权威,而是通过自己对技术的理解,修正了标准库的不足。而同样标准库也是知错能改,并没有因为自己的错误,或者自己订立标准库的便利,而固执不变。这正是我们做技术的应给学习的地方:不盲目权威,知错就改。
相关文章推荐
- 没有傲慢也没有偏见
- 没有傲慢也没有偏见
- 傲慢与偏见
- 吴鉴鹰谈一个单片机初学者的傲慢与偏见
- 傲慢与偏见。你所不知道的select()——The C10M Problem
- 傲慢与偏见
- 知识分子的傲慢与偏见 (2012-08-18 00:50:57)
- 姜奇平:电信的傲慢与偏见
- 真正的客观,没有偏见
- APIJSON-以坚持和偏执,回敬傲慢和偏见
- 不要因傲慢与偏见而拒绝基金
- 傲慢与偏见,select()最基本性能测试数据——The C10M Problem
- 傲慢与偏见
- 吴鉴鹰谈一个单片机初学者的傲慢与偏见
- 王垠:知识分子的傲慢与偏见
- 解剖CNN的傲慢与偏见
- APIJSON-以坚持和偏执,回敬傲慢和偏见
- geek的傲慢与偏见:《软件随想录》
- C++编译过程中"没有找到MFC80UD.DLL,因此这个程序未能启动.重新安装应用程序可能会修复此问题"? 的彻底解决
- iis 服务没有及时响应启动或控制请求