定义
向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放各种类型的动态数组。
容器特性
1.顺序序列
顺序容器中的元素按照严格的线性顺序排序。可以通过元素在序列中的位置访问对应的元素。
2.动态数组
支持对序列中的任意元素进行快速直接访问,甚至可以通过指针算述进行该操作。操供了在序列末尾相对快速地添加/删除元素的操作。
3.能够感知内存分配器的(Allocator-aware)
容器使用一个内存分配器对象来动态地处理它的存储需求。
赋值操作
与容器vector操作相关的函数有很多,函数的目录和简介请点这里《vector相关函数简介》:
#include <iostream> #include <vector> #define test(v) {\ cout<<".size():"<<v.size()<<endl;\ cout<<".empty():"<<v.empty()<<endl;\ cout<<".capacity():"<<v.capacity()<<endl;\ for (auto a:v) cout<<a<<" ";\ cout<<endl<<endl;\ } using namespace std; int main(void) { vector <int> v; //创建一个存放整型数据的空向量 test(v); vector <int> va(5); //创建整型数据向量,容量大小5 test(va); cout<<".max_size():"<<v.max_size()<<endl; //最大容纳元素个数 //在32/64bit机器上值不同,int/double/string各不相同 /*1.下标方式 */ va[0]=1; //声明时指定大小,才能像数组一样赋值 下标 0~4 va[1]=2; //未赋值前元素都是 0 即va[2]va[3]va[4]=0 //va[12]=11; //下标超出指定个数,编译不报错但程序可能会崩溃退出 test(va); /*2.push_back()函数 */ va.push_back(100); //追加一个数100,即va[5]=100,size增1 test(va); va.resize(11); //重新设置大小大于原值,新值被赋0 test(va); va.resize(6); //重新设置大小小于原值,弃用多余的元素 test(va); va.push_back(88); //追加一个数 va.resize(11); //重新设置大小大于原值,之前弃用的元素可能还在 test(va); va.push_back(1234); //追加一个数 va.push_back(56789); //追加一个数 test(va); cout<<"============="<<endl; vector <string> vb; //如果声明时不指定大小,不能用下标法赋值 test(vb); //vb[0]="c++"; //此时如用下标赋值,程序出错崩溃退出 vb.push_back("hello"); //size自动增一 vb.push_back("c++"); test(vb); cout<<".max_size():"<<vb.max_size()<<endl<<endl; vb[1]="python"; //此时下标也不能超限 test(vb); /*3.指定相同初值 */ vector <int> vc(5,1); //创建容器元素个数为 5,且值均为 1 test(vc); /*4.从其它容器复制全部或部分 */ vector<int> vd(va); //拷贝va全部元素,也即 (va.begin(),va.end()) test(vd); vector<int> ve(va.begin()+5,va.begin()+12); //拷贝7个:va[5]~va[11] test(ve); vector<int> vf(va.end()-3,va.end()); //拷贝3个:va[11]~va[13] test(vf); /*5.从同类型数组中复制全部或部分 */ int arr[]={0,1,2,3,4,5,6,7,8,9}; vector<int> vg(arr,arr+3); //从同类型数组中拷贝3个:arr[0]~arr[2] test(vg); int len=sizeof(arr)/sizeof(arr[0]); //len==10 vector<int> vh(arr+6,arr+len); //拷贝4个:arr[6]~arr[9] test(vh); //容器、数组的注意起始下标都是0,复制地址区间:“左向左开右闭,右向反之” //右向查找 rbegin rend rbegin=左向的end-1 rend=左向的begin-1 //或者直接:vector<int> vg={0,1,2,3,4,5,6,7,8,9}; //等于号=可有可无 /*6.insert()函数 */ vector<int> vi; //从其他容器中取数,插入 vi.insert(vi.begin(), va.begin(), va.begin() + 4); //拷贝4个:va[0]~va[3] test(vi); vector<int> vj; //从其他数组中取数,插入 vj.insert(vj.begin(), arr+2,arr+8); //拷贝6个:arr[2]~arr[7] test(vj); //补充:insert(vj.begin()+1,3,2) //在第一元素后插入3个2 /*7.copy()函数 */ vector<int> vk(10); //copy()的目标容器不能为空,需先分配空间且至少>0 copy(va.begin(), va.begin() + 4,vk.begin()); //拷贝4个:va[0]~va[3] test(vk); vector<int> vl; vl.reserve(8); //用reserve()预留空间,并不创建空间 test(vl); copy(arr+2,arr+8,vl.begin()+2); //依旧copy不成功,但程序不会崩溃 test(vl); vl.insert(vl.begin(),arr,arr+9); //先准备点空间 test(vl); copy(arr+2,arr+6,vl.begin()+3); //copy成功,并覆盖原来位置上的值 test(vl); /*8.assign()函数 */ vector<int> vm; vm.assign(10,2); //分派10个都为2的元素 test(vm); vm.assign(vl.begin(), vl.begin()+6); //或从其它容器中分派,覆盖方式 test(vm); vm.assign(vl.begin()+2, vl.end()); test(vm); return 0; }
运行结果如下:
.size():0 .empty():1 .capacity():0 .size():5 .empty():0 .capacity():5 0 0 0 0 0 .max_size():4611686018427387903 .size():5 .empty():0 .capacity():5 1 2 0 0 0 .size():6 .empty():0 .capacity():10 1 2 0 0 0 100 .size():11 .empty():0 .capacity():12 1 2 0 0 0 100 0 0 0 0 0 .size():6 .empty():0 .capacity():12 1 2 0 0 0 100 .size():11 .empty():0 .capacity():12 1 2 0 0 0 100 88 0 0 0 0 .size():13 .empty():0 .capacity():24 1 2 0 0 0 100 88 0 0 0 0 1234 56789 ============= .size():0 .empty():1 .capacity():0 .size():2 .empty():0 .capacity():2 hello c++ .max_size():2305843009213693951 .size():2 .empty():0 .capacity():2 hello python .size():5 .empty():0 .capacity():5 1 1 1 1 1 .size():13 .empty():0 .capacity():13 1 2 0 0 0 100 88 0 0 0 0 1234 56789 .size():7 .empty():0 .capacity():7 100 88 0 0 0 0 1234 .size():3 .empty():0 .capacity():3 0 1234 56789 .size():3 .empty():0 .capacity():3 0 1 2 .size():4 .empty():0 .capacity():4 6 7 8 9 .size():4 .empty():0 .capacity():4 1 2 0 0 .size():6 .empty():0 .capacity():6 2 3 4 5 6 7 .size():10 .empty():0 .capacity():10 1 2 0 0 0 0 0 0 0 0 .size():0 .empty():1 .capacity():8 .size():0 .empty():1 .capacity():8 .size():9 .empty():0 .capacity():9 0 1 2 3 4 5 6 7 8 .size():9 .empty():0 .capacity():9 0 1 2 2 3 4 5 7 8 .size():10 .empty():0 .capacity():10 2 2 2 2 2 2 2 2 2 2 .size():6 .empty():0 .capacity():10 0 1 2 2 3 4 .size():7 .empty():0 .capacity():10 2 2 3 4 5 7 8 -------------------------------- Process exited after 0.5482 seconds with return value 0 请按任意键继续. . .
size和capacity的区别
size()函数返回的是已用空间大小,capacity()返回的是总空间大小,capacity()-size()则是剩余的可用空间大小。当 size()==capacity(),说明 vector 目前的空间已被用完,如果再添加新元素,则会引起 vector 空间的动态增长。
resize和reverse的区别
reserve()只修改capacity大小,不修改size大小;resize()既修改capacity大小,也修改size大小。reserve(n)预先分配一块较大的指定大小的内存空间,这样当指定大小的内存空间未使用完时,是不会重新分配内存空间的,这样便提升了效率。只有当 n>capacity()时,调用 reserve(n)才会改变 vector 容量。resize()成员函数只改变元素的数目,不改变 vector 的容量。
size和max_size的区别
size()是向量的大小,当前存入的元素个数;max_size是此类向量在当前平台上能处理的最大元素个数,存放数据类型不同值就不同,所在平台是32还是64位值也不同。
其他重点摘要:
1. 空的 vector即empty()==true时,size()和 capacity()都为 0。
2. 当空间大小不足时,新分配的空间大小为原空间大小的 2 倍。
3. 使用 reserve()预先分配一块内存后,在空间未满的情况下,不会引起重新分配,从而提升了效率。
4. 当 reserve()分配的空间比原空间小时,是不会引起重新分配的。
5. resize()函数只改变容器的元素数目,未改变容器大小。
6. 用 reserve(size_type)只是扩大 capacity 值,这些内存空间可能还是“野”的,如果此时使用“[ ]”来访问,则可能会越界。而 resize(size_type new_size)会真正使容器具有 new_size 个对象。