• ###《Effective STL》--Chapter3


    点击查看Evernote原文

    #@author:       gr
    #@date:         2014-09-13
    #@email:        forgerui@gmail.com
    

    Chapter3 关联容器

    Topic 22: 切勿直接修改setmultiset中的键

    修改元素的值可以通过下面五步操作,避免作类型转换。

    struct IDNumberLess : public binary_function<Employee, Employee, bool> {
        bool operator() (const Employee& lhs, const Employee& rhs){
            return lhs.idNumber() < rhs.idNumber();
        }
    }
    /* 1. 查找要修改的元素 */
    set<Employee, IDNumberLess> se;
    //...
    Employee selectedID;
    iterator it = se.find(selectedID);
    if (it != se.end()){
        /* 2. 拷贝元素 */
        Employee tmp(*it);
        /* 3. 修改元素值 */
        tmp.setTitle("hello");
        /* 4. 删除原来元素 */
        se.erase(it++);
        /* 5. 插入新元素 */
        se.insert(it, tmp);
    }
    

    Topic 23: 考虑用排序的vector替代关联容器

    Topic 24: 当效率至关重要时,请在map::operator[]map::insert之间谨慎做出选择。

      这一条款说起来很简单,就是使用map时,如果是更新操作使用map::operator[];如果是插入新值时使用map::insert

    map<int, Widget> m;
    //更新操作,m中含有key为1,使用operator[]
    m[1] = 1.5;
    //插入操作,不含有key为2的项,不用operator[],使用insert
    m.insert(map<int, Widget>::value_type(2, 1.50));
    

      这个问题的起源在于map::operator[]既可以更新旧值又可以插入新值,但使用map::operator[]进行插入新值效率很低,他会先调用默认构造函数创建一个默认对象,返回引用,修改其值。
      
      最后也可以自己实现一个函数判断是更新还是插入,分别调用map::operator[]map::insert

      

    Topic 25: 熟悉非标准的散列容器

      除了标准的STL容器,还可以使用其它渠道的容器,包括hash_sethash_multisethash_maphash_multimap。不同的提供方实现的形式也各自不同。
      
      SGI的实现把元素放在一个单向的链表中,Dinkumware的实现则使用了双向链表,但内存消耗更大。根据自己的实际情况选择。

  • 相关阅读:
    angularjs 做不到实时脏值查询
    移动端遮罩层,放在页面最上面,并且不能滚动
    angularjs 与 UEditor开发,添加directive,保证加载顺序正常
    ajaxfileupload.js上传文件兼容IE7及以上版本
    IE9及以下版本获取上传文件的大小
    java 中的 i++ 和 ++i
    java foreach实现原理
    怎样将未分配的磁盘空间,合并到指定盘符上面
    电脑将系统之间调整为最大时间之后,重新启动电脑,屏幕一直狂闪
    变量
  • 原文地址:https://www.cnblogs.com/gr-nick/p/3996107.html
Copyright © 2020-2023  润新知