zoukankan      html  css  js  c++  java
  • STL学习笔记(七) 程序中使用STL

    条款43:算法调用优先于手写循环
    class Widget {
    public:
        bool test();
    };
    vector<Widget> vec;

    算法调用:

    for_each(vec.begin(), vec.end(), mem_fun_ref(&Widget::test));

    手写循环:

    for(auto it = vec.begin(); it != vec.end(); ++it)  it->test();


    算法调用优于手写循环:效率更高; 正确性更容易; 可维护性更高

    条款44:容器的成员函数优于同名算法


    优先使用容器的成员函数: 速度更快;与容器结合更紧密

    set<int>::iterator it = s.find(2012);    //T(n) = O(logn)
    set<int>::iterator it = find(s.begin(), s.end(), 2012);  //T(n) = O(n)

    使用关联容器时,优先考虑使用成员函数形式的 find、count,可以获得对数时间性能

    list容器成员函数效率高于同名的STL算法函数(list容器的成员函数无需任何对象拷贝,仅仅维护指针)
    注: list容器中 remove, remove_if, unique 不同于vector容器的先remove然后erase用法, list容器是实实在在删除元素,所以无需再erase
    注: STL的sort算法不能用于list容器(因为sort需要随机访问迭代器), list::sort()是稳定算法

    条款45:正确区分 count,find, binary_search, lower_bound, upper_bound, equal_range

    在选择具体的查找策略时,首先需要考虑迭代器制定的区间是否有序,如果有序,可以使用 binary_search, lower_bound, upper_bound, equal_range
    binary_search 返回值为 bool,仅仅表明查找值是否在有序序列中

    equal_range 返回一对迭代器
    第一个迭代器等于 lower_bound 返回的迭代器,指向第一个与查找值相等的元素
    第二个迭代器等于 upper_bound 返回的迭代器,指向最后一个与查找值相等元素的下一个元素
    1.如果返回的两个迭代器相等,则表明没有找到欲查找值(通过这个特性进行检查最终查找结果)
    2.有序序列中存在多少个元素与查找值相等: distance(it.first, it.second); //计算返回的两个迭代器之间的距离

    条款46:考虑使用函数对象而不是函数作为STL算法的参数
    vector<double> vec;
    sort(vec.begin(), vec.end(), greater<double>());    //使用标准函数对象,不要自己写一个comp函数

    当将一个函数进行参数传递时,其实传递的是该函数指针:

    sort(vector<double>::iterator first, vector<double>::iterator last, bool (*comp)(double, double));

    函数指针参数抑制了内敛机制,而标准STL函数对象使用了内敛机制,所以sort比qsort快

    条款47:避免产生"write only"代码

    写清晰的代码,避免编写非常复杂的复合语句,软件的维护比开发过程通常消耗更长的时间

    条款48:总是#include正确的头文件


    1.几乎所有的标准STL容器都声明在与之同名的头文件中
    2.除了4个STL算法之外,其余所有算法声明在<algorithm>中,这4个算法是 accumulate, inner_product, adjacent_difference, partial_sum 这4个声明在<numeric>中
    3.所有迭代器声明在<iterator>中
    4.标准函数子(如 less<T>), 函数适配器(bind2nd) 声明在<functional>中

    条款49:学会分析与STL相关的编译器诊断信息
    条款50:熟悉与STL相关站点
  • 相关阅读:
    MySQL数据库的优化
    PHP中获取文件扩展名
    PHP实现几种经典算法详解
    Linux服务器上crontab定时执行脚本文件
    LeetCode每日一题(五):加一
    巧妙利用枚举找出数组元素所在区间
    PHP实现几种经典算法详解
    _initialize() 区别 __construct()
    LeetCode每日一题(四):搜索插入位置
    LeetCode每日一题(三):移除元素
  • 原文地址:https://www.cnblogs.com/wwwjieo0/p/3444351.html
Copyright © 2011-2022 走看看