• STL总结


    1. 插入

    数组(已分配足够大小),vector,list,multiset插入100W个int来测试。

    速度:数组>vector>list>multiset

    若插入数组、vector的对象的复制构造代价很大,则存对象的指针。

    2.删除

    vector在尾部进行插入和删除时,速度很快;在其他位置删除和插入速度很慢,性能低下。

    deque在头部和尾部插入删除时速度快、高效(时间固定),其他位置插入删除时低效。

    list,multiset无论何处插入都高效,且list的插入比set还高效。

    从尾部进行插入、删除时(push_back(), pop_back())vector比list速度快。

    从vector的头部进行插入或者删除时非常低效。

    3. 遍历

    数组=vector >> list

    4. 查找

    当使用STL的find()算法在容器中进行查找时(find(container.begin(), container.end(), value)),速度:数组=vector > list > multiset

    之所以如此是因为用的通用的find算法,此算法进行顺序查找。若调用multiset自己的find算法则其查找速度相当快。

    5. 函数对象

    默认情况下accumulate函数对集合中的所有元素使用operator +,返回所有元素相加的结果。对于整数集合,若给accumulate提供的初始值是0,则返回所有元素的和。其实accumulate不局限于对象相加,它可以对集合元素进行任何操作,只要集合元素支持该操作。

    template <class InputIterator, class T>

    T accumulate(InputIterator begin, InputIterator end, T initValue);

    若想用accumulate函数完成对集合元素的其他操作,可以将一个函数指针或者函数对象传递给accumulate(第四个参数)。

    a:

    int mut(int x, int y) {return x * y;}

    vector<int> v; v.push_back(1);......

    int product = accumulate(v.begin(), v.end(), 1, mut);

    b: 

    class mut

    {

    public:

      int operator () (int x, int y) {return x * y;}

    }

    vector<int> v; v.push_back(1);......

    int product = accumulate(v.begin(), v.end(), 1, mut);


    由于STL已经提供了一个times的模板类,可以这样:

    int product = accumulate(v.begin(), v.end(), 1, times<int>());

    测试表明:用函数对象的版本比用函数指针的版本要快得多,因为函数指针到运行时才能确定,不能内联;函数对象编译时确定,可以内联operator()函数,所以效率高!


    6. 比STL更好

    尽量使用STL,别自己开发版本,一般不可能做到比STL更好。但也有例外。

    例如:翻转字符串的STL版本如下,

    char* p = "abcde";

    reverse(&p[0], &p[5]);

    自己实现:

    char* p = "abcde";

    char tmp;

    temp = p[4];

    p[4] = p[0];

    p[0] = tmp;

    ....

    测试表明比STL的实现要快。





  • 相关阅读:
    京东Java面试题(二)
    京东Java面试题(一)
    阿里java面试题
    Java垃圾回收机制
    MyBatis面试题
    Java IO流总结
    Spring中文文档
    Vue.js实战之组件之间的数据传递
    Vue.js实战之Vuex的入门教程
    Vue系列——在vue项目中使用jQuery及其第三方插件
  • 原文地址:https://www.cnblogs.com/kex1n/p/2142924.html
Copyright © 2020-2023  润新知