算法的几个标准:
常数型,与容器长度无关,算法始终是一个常数。如list的插入操作
对数型,与容器长度呈对数的关系,即logn
线性:与容器长度成正比。
1、仔细选择容器
顺序容器:vector,string,deque和list
关联容器:set, Multiset, map和MultiMap
非标准序列容器:slist,rope。slist是一个单向链表。list是双向的
非标准关联容器:hash_set,hash_multiset,hash_map,hash_multimap
2、使用empty代替size来检查是否为0
empty的操作是一个常数型的算法,而size肯呢过不是,如list的size可能是线性的。
3、使用区间成员函数代替单个元素的插入,删除赋值操作等
insert(positon, begin, end);
erase(begin, end)
assign(begin, end);
4、C++令人烦恼的解析
CTest a();
会被解析成声明了一个a函数,返回CTest。而不是一个类型为CTest的a对象。特别是碰到函数指针,会被解析成函数调用会觉得比较奇怪的哦
5、慎用删除选项
remove并不一定就是删除,如vector中要删除某元素一般是
remove和erase配合使用。remove的意思是交换,将要删除的元素放到后面。remove是算法,无法执行erase操作的,因为它是泛型编程,不知道原始元素的存在。
6、使用reserve
reserve改变的是可以容纳的vector的最大值,不会改变size。当reserve设置的值小于当前的capacity时,它会被忽略
7、swap的使用,休整过剩容量。
vector插入1000条时,想要收缩到10条,容量如何变小,可以使用swap来操作
vector<int> vsTmp;
vector<int> vsLarge;
vsLarge.swap(vsTmp),交换后,vsTmp的析构自动销毁。保证了空间的回收利用
8、避免使用vector<boo>
它是一个伪装的STL,它存储的不是bool值,而使用bitset的思想在实现。
deque<bool>是一个标准的STL,存储的是STL,或则使用bitset来代替。
9、使用vector和string来传递给以前需要指针的旧的接口API
void dosomething(const int * pIns, size_t num);
void dosomething(&vector[0], vector.size());
list等可以先赋值给vector,再使用vector来调用接口
vector<int> v(list.begin(), list.end());
10、考虑用有序的vector代替关联容器
如果只建立一次,排序的vector顺序更快。