STL源码剖析-vector

1.vector扩容 

                                                                    
(1)每次扩容是原来capacity的2倍,申请内容,将原内容copy到新内存.这些操作会影响到程序运行的效率,所以reserve()操作(提前分配一定量的内存)来避免不必要的重新分配是很有必要的
(2)每次扩容都有元素的大量拷贝工作,元素的拷贝会影响copy construct,原来的空间也要destory contruct,每次调用都会造成拷贝构造函数,析构函数

template <class T, class Alloc = alloc>                                                             
class vector {                                                                                      
public:                                                                                             
    typdef T value_type;                                                                            
    typedef valye_type* iterator;                                                                   
protected:                                                                                          
    iterator start;                                                                                 
    iterator finish;                                                                                
    iterator end_of_storage;                                                                        
};

2.resize和reverse的区别        

                                                                    
首先,两个函数的功能是有区别的:                                                                    
(1)reserve是容器预留空间,但并不真正创建元素对象,在创建对象之前,不能引用容器内的元素,因此当加入新的
元素时,需要用push_back()/insert()函数。
(2)resize是改变容器的大小,并且创建对象,因此,调用这个函数之后,就可以引用容器内的对象了,因此当加入>
新的元素时,用operator[]操作符,或者用迭代器来引用元素对象。
其次,两个函数的形式是有区别的:                                                                    
(3)reserve函数之后一个参数,即需要预留的容器的空间;                                                
resize函数可以有两个参数,第一个参数是容器新的大小,第二个参数是要加入容器中的新元素,如果这个参数被省
略,那么就调用元素对象的默认构造函数。

vector<int> myVec;                                                                                  
myVec.reserve( 100 );     // 新元素还没有构造,                                                      
// 此时不能用[]访问元素                                                                             
for (int i = 0; i < 100; i++ ) {                                                                    
    myVec.push_back( i ); //新元素这时才构造                                                        
}                                                                                                   
myVec.resize( 102 );      // 用元素的默认构造函数构造了两个新的元素                                 
myVec[100] = 1;           //直接操作新元素

3.vector使用优化

a)往屁股后边增加元素和从屁股删除元素都很快; push_back();                                           
b)往中间插入元素可能导致很多后续的元素要执行重新构造,析构。效率会非常之低                          
c)查找速度应该不会太快;

d)两个vector赋值,如果不使用原来vector可以使用std::move,std::move只是交换vector中的三个指针

vector<int> func() {
    vector<int> numbers;
    numbers.reverse(10);
    for (int i = 0; i < 10; ++i) {
        numbers.push_back(i);
    }
    return std::move(numbers);
}

                                                                                                                                                         
vector容器内存也是挨着的, vector容器有一个 “空间”的概念,每一个空间可以装一个元素;                
容器里有多少个元素可以用size()来看,而这个容器里有多少空间,可以 用capacity();                      
capacity()一定不会小于size();vector容器中空间的数量一定不会小于元素的数量;                         
用reverse可以预留空间,前提是你预先知道这个容器最多会容纳多少个元素;可以大量的提高程序的运行效率;

 

4、vector's iterator

vector是一个连续空间                                                                                
list的迭代器需要设计成一个类,因为链表的节点都是分离的

5.vector的迭代器失效

删除当前的iterator会使得后边所有元素的iterator都失效。这是因为其使用了连续分配的内存,阐述一个元素导致后面所有的元素都会向前移动一个位置,所以不能使用erase(iter++)的方式。但是erase方法可以返回下一个有效的iterator

https://blog.csdn.net/INGNIGHT/article/details/99832856

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值