C++高级_Vector容器 _STL标准模板库

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}

 

庄朋龙
庄朋龙

一个爱生活的技术菜鸟

留下评论

您的邮箱地址不会被公开。 必填项已用 * 标注