zoukankan      html  css  js  c++  java
  • Effective STL 学习笔记 Item 30: 保证目标区间足够大

    Effective STL 学习笔记 Item 30: 保证目标区间足够大

    1 容器区间与算法

    STL 容器吸引人的地方之一在于它能够自动管理内存,在有新的元素插入时候(通过 push_back(), push_front(), insert() )可以自动分配空间。但要注意的是,如果新的元素不是通过上述的 navive method 加进来的话,容器不会自动分配内存,例如下面的代码:

    1: int transmogrify(int x); // this function produces some new value from x.
    2: vector<int> values;
    3: vector<int> results
    4: 
    5: transform(values.begin(), values.end(), results.end(), transmogrify);
    

    这里有两个问题:

    • 第五行代码会直接向 results 的尾部写入数据,而尾部的内存未知,会引发问题
    • 直接的操作不会改变容器内部记录的 size & capacity ,从而破坏的容器。

    2 back_inserter

    我们应该想办法调用 push_front,push_back or insert 来插入数据:

    int transmogrify(int x); // this function produces some new value from x.
    vector<int> values;
    vector<int> results
    
    transform(values.begin(), values.end(), back_inserter(results), transmogrify);
    

    3 front_inserter

    如果上面的代码中使用的是可以双向插入数据的容器( deque or list ),还可以使用 push_front

    1: int transmogrify(int x); // this function produces some new value from x.
    2: list<int> values;
    3: list<int> results
    4: 
    5: transform(values.begin(), values.end(), front_inserter(results), transmogrify);
    

    上面的代码还有个问题,由于每个数据都会被插到头部,实际上最后得到的 results 里面数据的顺序和 values 里面是相反的,我们可以反向遍历 values:

    int transmogrify(int x); // this function produces some new value from x.
    list<int> values;
    list<int> results
    
    transform(values.rbegin(), values.rend(), front_inserter(results), transmogrify);
    

    4 inserter

    front_inserter & back_inserter 可以向前或者向后插入数据,而 inserter 则可以向任意位置插入数据:

    int transmogrify(int x); // this function produces some new value from x.
    vector<int> values;
    vector<int> results
    
    transform(values.begin(), values.end(),
              inserter(results, results.begin() + results.size()/2),
              transmogrify);
    

    5 inserter & reserve

    Item 14 中提到过,vector 插入式数据可能会引起内存的重新分配,从而影响性能,对于前面的几个例子来说,我们可以预先算出插入新的数据后 vector 有多大,因此可以是所有 Item 14 中提到过的方法来优化:

    int transmogrify(int x); // this function produces some new value from x.
    vector<int> values;
    vector<int> results
    
    result.reserve(result.size() + values.size());
    transform(values.begin(), values.end(),
              inserter(results, results.begin() + results.size()/2),
              transmogrify);
    
  • 相关阅读:
    H5 使用 jssdk 出现的问题 错误码:63002 签名错误
    vue 使用 scss
    JS之常用字符串处理类
    hive数仓中两个维度表如果想合并纬度产生新自增ID方法
    叉乘,判线段相交,凸包
    二分查找
    大整数运算
    判定最小生成树是否唯一
    Prim算法
    Boruvka算法
  • 原文地址:https://www.cnblogs.com/yangyingchao/p/3411945.html
Copyright © 2011-2022 走看看