vector 容器 (动态数组) : 单口容器
- 提供两个迭代器(正向、反向): begin() end() rbegin() rend()
vector 容器动态增长的原理
- 当插入新元素的时候,如果空间不足,则vector会申请更大的内存空间(默认是2倍原来大小),将原来的数据拷贝到新内存空间,释放原来的内存空间,再把新元素插入。
vector 容器初始化
- vector<T> v1; //默认构造函数
- vector<T> v2( v1.begin(), v1.end() ); //将v1 begin()和 end() 之间的元素拷贝到v2
- vector<T> v3( n elements); //将n个elements拷贝到v3
- vector<T> v4( const vector& vec); //拷贝构造
int arr[] = {2,154,5,7,8,9,4,46,75,8,943,95};
vector<int> v1(arr,&arr[sizeof(arr)/sizeof(int)]);
vector<int> v2(v1.begin(),v1.end());
vector<int> v3(v2);
vector<int> v4(10,arr[0]); //v4:10个2
vector容器的赋值
- assign( begin , end); //将begin(元素的地址)和end之间的元素赋值给vector
- assign( n , elements); //将n个elements拷贝到vector
- =重载等号操作符 //将另一个vector赋值给vector
- swap(vector1); //将vector1和本vector交换(类的保存地址的成员变量的值发生的交换,并不是真的数据存储空间发生了交换)
容器大小操作
-
size() //返回容器中元素的个数
-
empty() //判断容器是否为空
-
resize(int n) //如果n大于原来的元素个数,则后面默认补0,如果小于原来的元素个数,则原vector后面的元素将删除
-
resize(int n,elements) // 如果指定的长度大于原来的元素个数,后面会为elements
-
capacity() //vector的容量 >= 元素的个数
-
reserve(int len) // 改变容器capacity的大小,如果你提前知道容器内的元素个数,可以提前申请大的内存,而不至于在添加元素的时候因为内存不够再去申请内存(这是要发生拷贝数据的,数据量大是时候是非常耗时)
容器数据读取操作
- at(); //抛异常
- [] // 不抛异常
- front() //返回容器的第一个数据
- back() // 返回容器的最后一个数据
容器数据插入和删除
- insert(iterator pos, int n, element) //在迭代器pos的位置,插入n 个 elements
- push_back() //在尾部插入一个元素
- pop_back() //从尾部删除一个元素
- erase(iterator pos_of_begin, iterator pos_of_end) //删除迭代器begin和end之间的元素
- erase(iterator pos) //删除迭代器指向的元素
- clear() //删除容器中所以元素
容器收缩空间
在vector的capacity变大的之后,再将里面元素删去capacity是不会变小的,浪费资源
vector(v).swap(v); //将v的capacity 收缩
解释:
- vector(v) : 申明一个匿名对象,用(v)对其初始化,根据v里面实际元素个数去初始化自己
- .swap(v) :再和v进行交换,指向数据内存的指针交换,这时候匿名对象指向原理的v(capacity大的),v指针指向匿名对象的元素(从v自己这边拷贝的),结束之后,匿名对象释放(大的空间释放)。