[c++基础] STL

1. STL capacity()reserve()函数

C++中,理解capacitysize之间的区别非常重要。容器的size是指它已经保存的元素的数目;而capacity则是在不分配新的内存空间的前提下它最多可以保存多少元素。

 

当创建空容器时,容量(capacity) 0;当用完时,增加原容量为原来2倍。 
capacity
适用如vector这种元素连续存储的容器,实际具有capacity属性的容器只有vectorstring 
capacity
一般大于size的原因是为了避免每次增加数据时都要重新分配内存,所以一般会生成一个较大的空间,以便随后的数据插入。

如果不使用reserve()方法,每次push_back的时候可能需要重新分配内存,然后拷贝到新的内存区域,然后释放旧的内存。这样,一旦需要不断push_back的时候,就要不停重复上述的操作。但是,如果事先知道需要插入多少元素,使用reserve()方法事先分配好内存,每次插入的时候只进行插入的那个拷贝操作,效率会有一定的提升。

http://blog.csdn.net/qq844352155/article/details/38518787



2.STL增删元素对迭代器的影响:

a、 对于连续内存容器,如vectordeque等,增减元素均会使得当前之后的所有迭代器失效。因此,以删除元素为例:由于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、 对于非连续内存容器,如setmap等。增减元素只会使得当前迭代器无效。仍以删除元素为例,由于删除元素后,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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值