#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;
}