• 没有傲慢也没有偏见


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

    两个*台的标准:
    查看c++文档发现删除迭代器函数
    c++98 标准 erase返回void
    c++11 标准 erase返回iterator
    再看微软的文档:
    和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,会导致程序发生不可预料的结果。

    总结:
        通过上面的二段代码,发现返回下一个迭代器更加合理,因为在循环内删除,需要指向下次迭代器的值。从这些历史的变迁里,微软让我更加敬佩,他们没有盲目的去崇拜或者遵循权威,而是通过自己对技术的理解,修正了标准库的不足。而同样标准库也是知错能改,并没有因为自己的错误,或者自己订立标准库的便利,而固执不变。这正是我们做技术的应给学习的地方:不盲目权威,知错就改。
  • 相关阅读:
    R并行计算
    VMware虚拟机安装linux系统
    爬虫资料
    R-shiny服务器安装及配置
    数模国赛——致病基因
    vs 2013远程调试
    获取url的hash值
    JavaScript调试技巧之console.log()详解
    无法打开登录所请求的数据库
    location.host 与 location.hostname 的区别
  • 原文地址:https://www.cnblogs.com/fengju/p/6174313.html
Copyright © 2020-2023  润新知