美文网首页
Effective STL 2020-08-11

Effective STL 2020-08-11

作者: liyangyao | 来源:发表于2020-08-11 22:25 被阅读0次

    第5条 区间成员函数优先于与之对应的单元素成员函数

    • 区间创建
    container::container(begin, end)
    
    • 区间插入
    void container::insert(position, begin, end)
    
    • 区间删除
    //序列容器
    iterator container::erase(begin, end)
    //关联容器
    void container::erase(begin, end)
    
    • 区间赋值
    void container::assign(begin, end)
    

    第9条 慎重选择删除的方法

    • 连续内在窗口,最好的办法是使用erase-remove习惯用法
        c.erase(remove(c.begin(), c.end(), 1963), c.end())
        //满足特定条件的的所有对象
        v1.erase(std::remove_if(v1.begin(), v1.end(), [](int v)
        {
            return v==2 || v==3;
        }), v1.end());
    
        for(auto it = v1.begin(); it != v1.end(); )
        {
            if (*it == 2 || *it == 3)
            {
                it = v1.erase(it);
            }
            else{
                it++;
            }
        }
    
    • 对于list,成员函数remove更加有效
    c.remoe(1963)
    
    • 对于标准关联窗口(set, multiset, map, multimap),正确方法是调用erase
    c.erase(1963)
    //满足特定条件的的所有对象
    for(auto it = c.begin(); it != c.end(); )
    {
        if (it->first == 2 || it->first == 3)
        {
            c.erase(it++);
        }
        else{
            ++it;
        }
    } 
    

    第17条 使用"swap技巧"除去多余的容量

    vector<int>(v).swap(v);
    

    第23条 考虑用排序的vector替代关联窗口

    //代码骨架
    sort(v.begin, v.end)
    if (binary_search(v.begin, v.end)) ...
    auto i = lower_bound(v.begin, v.end)
    auto range = equal_range(v.begin, v.end)
    if (range.first != range.second)
    {
        qDebug()<<"find, distance:"<< distance(range.first, range.second);
    }
    

    相关文章

      网友评论

          本文标题:Effective STL 2020-08-11

          本文链接:https://www.haomeiwen.com/subject/hlcudktx.html