STL源码解析-04序列容器-01vector

本文深入解析了C++标准库中的vector容器如何实现动态分配内存,包括其内部指针start、finish、end_of_storage的作用,以及push_back、pop_back、clear、erase等常见操作对内存的影响。
#include <iostream>
#include <vector>
 
using namespace std;
 
*****************************************************
 * vector中的数据结构主要是三个指针:
 * start;空间的头
 * finish:使用空间的尾
 * end_of_storage:可用空间的尾
 * 指示的范围左闭右开,内存是一块连续的地址。
 * ************************************************
 
int main()
{
    vector<int> iv0;                                //初始几个,分配的capacity就是几个。
    cout << "max_size:" << iv0.max_size() << endl;  //只与系统等设备有关
    cout << "size:" << iv0.size() << endl;          //没有初始化值,为0.
    cout << "capacity:" <<iv0.capacity() << endl;   //0
 
    iv0.push_back(1);
    //如果有空余空间,直接增大finish指针;
    //没有,如果size是0,申请大小为1,如果大于0,则申请大小是该值的两倍,
    //申请结束之后,使用uninitialized_copy函数,将原内容拷贝到新地址,再将插入数据拷贝过来,
    //析构并释放原地址内容,调整start,finish,end_of_storage指针。
    cout << "max_size:" << iv0.max_size() << endl;  
    cout << "size:" << iv0.size() << endl;          //1
    cout << "capacity:" <<iv0.capacity() << endl;   //1
 
    iv0.push_back(2);
    cout << "max_size:" << iv0.max_size() << endl;  
    cout << "size:" << iv0.size() << endl;          //2
    cout << "capacity:" <<iv0.capacity() << endl;   //2
    
    iv0.push_back(3);
    cout << "max_size:" << iv0.max_size() << endl;
    cout << "size:" << iv0.size() << endl;          //3
    cout << "capacity:" <<iv0.capacity() << endl;   //4,不够变为原来的两倍
 
    iv0.push_back(4);
    cout << "max_size:" << iv0.max_size() << endl;
    cout << "size:" << iv0.size() << endl;          //4
    cout << "capacity:" <<iv0.capacity() << endl;   //4
 
    iv0.push_back(5);
    cout << "max_size:" << iv0.max_size() << endl;
    cout << "size:" << iv0.size() << endl;          //5
    cout << "capacity:" <<iv0.capacity() << endl;   //8
 
    vector<int> iv3(3,10);
    cout << "max_size:" << iv3.max_size() << endl;
    cout << "size:" << iv3.size() << endl;          //3
    cout << "capacity:" <<iv3.capacity() << endl;   //3 ,初始化时,空间与初始值一样。
    
    iv3.pop_back();
    //finish指针--,在调用destroy(finish);
    cout << "max_size:" << iv3.max_size() << endl;
    cout << "size:" << iv3.size() << endl;          //2
    cout << "capacity:" <<iv3.capacity() << endl;   //3,POP掉之后,capacity不变。
 
    iv3.clear();
    cout << "max_size:" << iv3.max_size() << endl;
    cout << "size:" << iv3.size() << endl;          //0,只是将size减小,capacity不变。
    cout << "capacity:" <<iv3.capacity() << endl;   //3
    
    //erase(iterator first, iterator last)
    //1,i = copy(last,finish,first),将后面的元素覆盖前面的元素;
    //2,destroy(i, finish),销毁多余对象;
    //3,finish = finish- (last - first),移动finish指针。
 
    //clear
    //erase(first(), end())
 
    //insert(iteraor, n, t),插入n个t。
    //由于vector是动态分配空间,所以必须考虑capacity是否满足新增加元素的要求。
    //if n!=0 进行下面操作,n==0不管
    //if end_of_storage-finish >= n,说明够
    //  计算插入点之后的元素个数:elems = finish - iterator
    //  if elems>n 后面的元素多
    //      uninitialized_copy(finish-n, finish, finish),将finishi之前的n个元素copy到finish之后。
    //      copy_backward(iteraor, old_finish-n, old_finish),将iterator开始的elems-n个元素,copy到finish之前。
    //      fill(iterator, iterator+n, t);
    //  else 后面的元素少
    //      uninitialized_fill_n(finish, n-elems, t),先将多余的n-elems个元素在finishi之后构造
    //      uninitialized_copy(iterator,old_finish,finish),将elems个元素拷贝到新的finish之后。
    //      fill(iterator, iterator+n, t)
    //else 存储空间不够
    //  按照两倍开辟新的空间
    //  new_finish = uninitialized_copy(start, iterator, new_start);拷贝start到iterator的元素
    //  new_finish = uninitialized_fill_n(new_finish,n,t),填充插入的n个元素
    //  new_finish = uninitialized_cop(iterator, finish, new_finish),拷贝iterator到finish的元素
    //
    //  destroy(start, finish),销毁原来的对象
    //  deallocate(),回收内存地址
    //
    //  设置start为新的start等。
    
    return 0;
}

转载于:https://www.cnblogs.com/shaotenghan/archive/2011/12/02/2272128.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值