[转载]STL学习之Vector

来源:互联网 发布:苹果电脑直播音效软件 编辑:程序博客网 时间:2024/06/06 08:54

一、Vector的介绍
向量 vector 是一种对象实体, 能够容纳许多其他类型相同的元素, 因此又被称为容器。 与string相同, vector 同属于STL(Standard Template Library, 标准模板库)中的一种自定义的数据类型, 可以广义上认为是数组的增强版。
在使用它时, 需要包含头文件 vector, #include
vector 容器与数组相比其优点在于它能够根据需要随时自动调整自身的大小以便容下所要放入的元素。此外, vector 也提供了许多的方法来对自身进行操作。
二、vector的声明及初始化和赋值
vector 型变量的声明以及初始化的形式也有许多, 常用的有以下几种形式:

vector<int> a;          //声明一个int型向量avector<int> a(10);      //声明一个初始大小为10的向量vector<int> a(10, 1);   //声明一个初始大小为10且初始值都为1的向量vector<int> b(a);      //声明并用向量a初始化向量bvector<int> b(a.begin(), a.begin()+3); //将a向量中从第0个到第2个(共3个)作为向量b的初始值

数组进行初始化

 int n[] = {1, 2, 3, 4, 5}; vector<int> a(n, n+5);         //将数组n的前5个元素作为向量a的初值 vector<int> a(&n[1],&n[4]);  //将n[1] - n[4]范围内的元素作为向量a的初值

赋值
vector赋值给另一个vector:
方法1:

vector<int > v1(v2);   //声明

方法2:使用swap进行赋值:

vector<int > v1();v1.swap(v2); //将v2赋值给v1,此时v2变成了v1

方法3:使用函数assign进行赋值:

vector<int > v1;//声明v1v1.assign(v2.begin(), v2.end());//将v2赋值给v1

方法4:使用循环语句赋值,效率较差

vector<int >::iterator it;  //声明迭代器for(it = v2.begin();it!=v2.end();++it) / /遍历v2,赋值给v1{                                          v1.push_back(it);}

三、元素的输入及访问
元素的输入和访问可以像操作普通的数组那样, 用cin>>进行输入, cout<

#include<iostream>    #include<vector>    using namespace std ;    int main()    {        vector<int> a(10, 0) ;      //大小为10初值为0的向量a        //对其中部分元素进行输入        cin >>a[2] ;        cin >>a[5] ;        cin >>a[6] ;        //全部输出        int i ;        for(i=0; i<a.size(); i++)            cout<<a[i]<<" " ;        return 0 ;    }

在元素的输出上, 还可以使用遍历器(又称迭代器)进行输出控制。在 vector b(a.begin(), a.begin()+3) ; 这种声明形式中, (a.begin()、a.begin()+3) 表示向量起始元素位置到起始元素+3之间的元素位置。(a.begin(), a.end())则表示起始元素和最后一个元素之外的元素位置。
向量元素的位置便成为遍历器, 同时, 向量元素的位置也是一种数据类型, 在向量中遍历器的类型为: vector::iterator。 遍历器不但表示元素位置, 还可以再容器中前后移动。
在上例中讲元素全部输出部分的代码就可以改写为:

//全部输出    vector<int>::iterator t ;    for(t=a.begin(); t!=a.end(); t++)        cout<<*t<<" " ;

四、Vector的基本操作

1>. a.size()                 //获取向量中的元素个数    a.resize(num)           //重新指定容器长度为num;容器变长则以默认值填充新位置。容器变短,末尾超过容器长度的元素被删除2>. a.empty()                //判断向量是否为空3>. a.clear()                //清空向量中的元素4>. 复制        a = b ;            //将b向量复制到a向量中,**深度拷贝**5>. 比较        保持 ==、!=、>、>=、<、<= 的惯有含义 ;        如: a == b ;    //a向量与b向量比较, 相等则返回16>. 插入 - insert                                    //**insert的位置是迭代器位置,切勿写成0,1之类;**        ①、 a.insert(a.begin(), 1000);             //将1000插入到向量a的起始位置前                ②、 a.insert(a.begin(), 3, 1000) ;        //将1000分别插入到向量元素位置的0-2处(共3个元素)           ③、 vector<int> a(5, 1) ;            vector<int> b(10) ;            b.insert(b.begin(), a.begin(), a.end());//将a.begin(), a.end()之间的全部元素插入b.begin()前7>. 删除 - erase        ①、 b.erase(b.begin()) ;                     //将起始位置的元素删除        ②、 b.erase(b.begin(), b.begin()+3) ;        //将(b.begin(), b.begin()+3)之间的元素删除8>. 交换 - swap        b.swap(a) ;              //a向量与b向量进行交换9>.末尾的添加移除-push/back       vector_a.push_back(1);   //在容器尾部加入一个元素       vector_a.pop_back;       //移除容器尾部一个元素10>.元素读取-front()/back()      int F=vector_a.front();    //获得容器的首元素     int B=vector_a.back();      //获得容器的尾部元素11>.元素排序sort() 需要包含algorithm头文件,默认从小到大

五、二维向量
与数组相同, 向量也可以增加维数, 例如声明一个m*n大小的二维向量方式可以像如下形式:

    vector< vector<int> > b(10, vector<int>(5));        //创建一个10*5的int型二维向量

在这里, 实际上创建的是一个向量中元素为向量的向量。同样可以根据一维向量的相关特性对二维向量进行操作。

1     #include<iostream> 2     #include<vector> 3  4     using namespace std ; 5  6     int main() 7     { 8         vector< vector<int> > b(10, vector<int>(5, 0)) ; 9 10         //对部分数据进行输入11         cin>>b[1][1] ;12         cin>>b[2][2] ;13         cin>>b[3][3];14 15         //全部输出16         int m, n ;17         for(m=0; m<b.size(); m++)           //b.size()获取行向量的大小18         {19             for(n=0; n<b[m].size(); n++)    //获取向量中具体每个向量的大小20                 cout<<b[m][n]<<" " ;21             cout<<"\n" ;22         }23 24         return 0;25     }

同样, 按照这样的思路我们还可以创建更多维的向量, 不过维数太多会让向量变得难以灵活控制, 三维以上的向量还需酌情使用。
此篇文章大部分参考如下,并在基础上添加修改。
http://www.cnblogs.com/mr-wid/archive/2013/01/22/2871105.html

0 0