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的实现要快。





原文地址:https://www.cnblogs.com/kex1n/p/2142924.html