Vector是将元素置于一个 动态数组 中 加以管理的容器。
Vector可以随机存取元素(支持索引值直接存取就像数组一样方便,使用 [] 操作符或者 at()方法)。是一种随机访问的数组类型,它提供了对数组元素的快速访问、随机访问,以及在序列尾部快速、随机地插入和删除操作。它类似于数据结构中的队列、数组和堆栈等概念。
Vector是一个类模板,而不是一种数据类型,使用时需要添加头文件:#include<vector>
vector尾部添加或移除元素非常快速。但是在中部或头部插入元素或移除 元素比较费时。
vector类为内置数组提供了一种替代表示,与string类一样 vector 类是随标准 C++引入的标准库的一部分,那么vector和数组的主要区别是什么呢??
数组:分配的是静态空间,一般分配了就不可以改变,如果数据想要扩容,那么我们就需要重新申请大一点数组,然后把原数组中数据复制过来。
vector:分配的是动态空间,vector是随着元素的加入,空间自动扩展的。但是,我们必须要负责任的肯定vector分配的空间是连续的,也就是支持数组中的下标随机访问。
实际上vector的实现机制是:预留一部分空间,而且预留空间的大小是按一定比率增长的,如果空间不够用的话,要保证连续,就必须重新new一片空间,然后将原有元素移动到新空间,同时预留新的空间(并且新分配的空间比原来分配的空间),最后将原来的那部分空间释放掉。这样预留空间的好处就是不用每次向vector中加元素都重新分配空间。
下面就来看看Vevtor对象的默认构造函数都有哪些:
vector<T> vecT; //vector采⽤用模板类实现,vector对象的默认构造形式 vector<int> vecInt; //⼀一个存放int的vector容器。 vector<float> vecFloat; //⼀一个存放float的vector容器。 vector<string> vecString; //⼀一个存放string的vector容器。 //尖括号内还可以设置指针类型或⾃自定义类型。 Class Teacher{}; vector<Teacher*> vecpTeacher; //⽤用于存放Teacher对象的指针的vector容器。 vector<Teacher> vecTeacher; //⽤用于存放Teacher对象的vector容器。 //由于容器元素的存放是按值复制的⽅方式进⾏行的, //所以此时Teacher必须提供Teacher的拷⻉贝构造函数, //以保证Teacher对象间拷⻉贝正常。 /* *带参数的构造函数 */ vector(v.begin(),v.end()); //构造函数将[begin(), end())区间中的元素拷⻉贝给本⾝身。 注意该区间是左闭右开的区间。 vector(n,elem); //构造函数将n个elem拷⻉贝给本⾝身。 vector(const vector &vec); //拷⻉贝构造函数。
我来给大家演示一下以上部分构造函数的部分用法(更多方法可以自己探索):
#include <iostream> #include <vector> using namespace std; int main() { vector<int>::iterator iter; //第一种方式 vector<int> v1; v1.push_back(1); v1.push_back(2); v1.push_back(3); cout<<"第一种方式的输出结果:"<<endl; for(iter = v1.begin() ; iter != v1.end() ; iter++) { cout<<*iter<<" "; } cout<<endl; //第二种方式 vector<int> v2(v1); cout<<"第二种方式的输出结果:"<<endl; for(iter = v2.begin() ; iter != v2.end() ; iter++) { cout<<*iter<<" "; } cout<<endl; //第三种方式 vector<int> v3(3); cout<<"第三种方式的输出结果:"<<endl; for(iter = v3.begin() ; iter != v3.end() ; iter++) { cout<<*iter<<" "; } cout<<endl; //第四种方式 vector<int> v4(3,4); cout<<"第四种方式的输出结果:"<<endl; for(iter = v4.begin() ; iter != v4.end() ; iter++) { cout<<*iter<<" "; } cout<<endl; //第五种方式 vector<int> v5(v1.begin(),v1.end()-1); cout<<"第五种方式的输出结果:"<<endl; for(iter = v5.begin() ; iter != v5.end() ; iter++) { cout<<*iter<<" "; } cout<<endl; //第六种方式 int a[] = {1,2,3,4}; vector<int> v6(a+1,a+2); cout<<"第六种方式的输出结果:"<<endl; for(iter = v6.begin() ; iter != v6.end() ; iter++) { cout<<*iter<<" "; } cout<<endl; // v6.~vector<int>(); cout<<"释放内存后的结果是:"<<endl; for(iter = v6.begin() ; iter != v6.end() ; iter++) { cout<<*iter<<" "; } cout<<endl; return 0; }
vector的赋值
vector.assign(beg,end); //将[beg, end)区间中的数据拷⻉贝赋值给本⾝身。 //注意该区间是左闭右开的区间。 vector.assign(n,elem); //将n个elem拷⻉贝赋值给本⾝身。 vector& operator=(const vector &vec); //重载等号操作符 vector.swap(vec); // 将vec与本⾝身的元素互换。 vector<int> vecIntA, vecIntB, vecIntC, vecIntD; int iArray[] = {0,1,2,3,4}; vecIntA.assign(iArray,iArray+5); vecIntB.assign( vecIntA.begin(), vecIntA.end()); //⽤用其它容器的迭代器作参数。 vecIntC.assign(3,9); vector<int> vecIntD; vecIntD = vecIntA; vecIntA.swap(vecIntD);
vector的大小
vector.size(); //返回容器中元素的个数 vector.empty(); //判断容器是否为空 vector.resize(num); //重新指定容器的⻓长度为num,若容器变⻓长,则以默认值填充新位置。 如果容器变短,则末尾超出容器⻓长度的元 素被删除。 vector.resize(num, elem); //重新指定容器的⻓长度为num,若容器变⻓长,则以elem值填充新位置。如果容器变短,则末尾超出容器⻓长>度的元素被删除。
/* *例如 vecInt是vector<int> 声明的容器,现已包含1,2,3元素。 */ int iSize = vecInt.size(); //iSize == 3; bool bEmpty = vecInt.empty(); //bEmpty == false; vecInt.resize(5); //此时⾥里⾯面包含1,2,3,0,0元素。 vecInt.resize(8,3); //此时⾥里⾯面包含1,2,3,0,0,3,3,3元素。 vecInt.resize(2); //此时⾥里⾯面包含1,2元素。
vector 的数据存取
vec.at(idx); //返回索引idx所指的数据,如果idx越界,抛出out_of_range异常。 vec[idx]; //返回索引idx所指的数据,越界时,运⾏行直接报错
vector<int> vecInt; //假设包含1 ,3 ,5 ,7 ,9 vecInt.at(2) == vecInt[2]; // 得到 5 vecInt.at(2) = 8; //或 vecInt[2] = 8; int iF = vector.front(); //vecInt 就包含 1, 3, 8, 7, 9值 int iB = vector.back(); //iF==1 vector.front() = 11; //iB==9 //vecInt包含{11,3,8,7,9} vector.back() = 19; //vecInt包含{11,3,8,7,19}
vector末尾添加移除操作
vector<int> vecInt; vecInt.push_back(1); //在容器尾部加⼊入⼀一个元素 vecInt.push_back(3); vecInt.push_back(5); vecInt.push_back(7); vecInt.push_back(9); //{1,3,5,7,9} vecInt.pop_back(); //移除容器中最后⼀一个元素 vecInt.pop_back(); //{1 ,3 ,5}