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