1. STL capacity()和reserve()函数
在C++中,理解capacity和size之间的区别非常重要。容器的size是指它已经保存的元素的数目;而capacity则是在不分配新的内存空间的前提下它最多可以保存多少元素。
当创建空容器时,容量(capacity)为 0;当用完时,增加原容量为原来2倍。
capacity适用如vector这种元素连续存储的容器,实际具有capacity属性的容器只有vector和string。
capacity 一般大于size的原因是为了避免每次增加数据时都要重新分配内存,所以一般会生成一个较大的空间,以便随后的数据插入。
如果不使用reserve()方法,每次push_back的时候可能需要重新分配内存,然后拷贝到新的内存区域,然后释放旧的内存。这样,一旦需要不断push_back的时候,就要不停重复上述的操作。但是,如果事先知道需要插入多少元素,使用reserve()方法事先分配好内存,每次插入的时候只进行插入的那个拷贝操作,效率会有一定的提升。
http://blog.csdn.net/qq844352155/article/details/38518787
2.STL增删元素对迭代器的影响:
a、 对于连续内存容器,如vector、deque等,增减元素均会使得当前之后的所有迭代器失效。因此,以删除元素为例:由于erase()总是指向被删除元素的下一个元素的有效迭代器,因此,可以利用该连续内存容器的成员erase()函数的返回值。
for(auto iter = myvec.begin(); iter != myvec.end()) {
if(delete iter) iter = myvec.erase(iter);
else ++iter;
}
当增加元素后整个vector的大小超过了预设,这时会导致vector重新分分配内存,效率极低。因此习惯的编程方法为:在声明了一个vector后, 立即调用reserve函数,令vector可以动态扩容。通常vector是按照之前大小的2倍来增长的。
b、 对于非连续内存容器,如set、map等。增减元素只会使得当前迭代器无效。仍以删除元素为例,由于删除元素后,erase()返回的迭代器 将是无效的迭代器。因此,需要在调用erase()之前,就使得迭代器指向删除元素的下一个元素。
for(auto iter = myset.begin(); iter != myset.end()) {
if(delete iter) myset.erase(iter++); //使用一个后置自增就OK了
else ++iter;
}
3. STL中排序算法的实现是什么?
STL中的sort(),在数据量大时,采用quicksort,分段递归排序;一旦分段后的数量小于某个门限值,改用Insertion sort,避免quicksort深度递归带来的过大的额外负担,如果递归层次过深,还会改用heapsort。