容器

算法的几个标准:

常数型,与容器长度无关,算法始终是一个常数。如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顺序更快。


你可能感兴趣的:(容器)