原创 vector用法demo

2010-10-24 14:39 2540 6 6 分类: 工程师职场

vector的用法


vector(向量): C++中的一种数据结构,确切的说是一个类.它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多


大时,用其来解决问题可以达到最大节约空间的目的.


用法:
1.文件包含:    
首先在程序开头处加上#include<vector>以包含所需要的类文件vector
还有一定要加上using namespace std;


2.变量声明:
例:声明一个int向量以替代一维的数组:vector <int> a;
(等于声明了一个int数组a[],大小没有指定,可以动态的向里面添加删除)。


例:用vector代替二维数组.其实只要声明一个一维数组向量即可,而一个数组的名字其实代表的是它的首地址,
所以只要声明一个地址的向量即可,即:vector <int *> a.同理想用向量代替三维数组也是一样,vector <int**>a;
再往上面依此类推.


3.具体的用法以及函数调用:
如何得到向量中的元素?其用法和数组一样:
例如:
vector <int> a
int b = 5;
a.push_back(b);//该函数下面有详解
cout<<a[0];    //输出结果为5


1.push_back   在数组的最后添加一个数据
2.pop_back    去掉数组的最后一个数据
3.at          得到编号位置的数据
4.begin       得到数组头的指针
5.end         得到数组的最后一个单元+1的指针
6.front       得到数组头的引用
7.back        得到数组的最后一个单元的引用
8.max_size    得到vector最大可以是多大
9.capacity    当前vector分配的大小
10.size       当前使用数据的大小
11.resize     改变当前使用数据的大小,如果它比当前使用的大,者填充默认值
12.reserve    改变当前vecotr所分配空间的大小
13.erase      删除指针指向的数据项
14.clear      清空当前的vector
15.rbegin     将vector反转后的开始指针返回(其实就是原来的end-1)
16.rend       将vector反转构的结束指针返回(其实就是原来的begin-1)
17.empty      判断vector是否为空
18.swap       与另一个vector交换数据


4.备注:在用vector的过程中我碰到了一个问题,特此列出讨论:
1)
vector <int > a;
int  b = 5;
a.push_back(b);
此时若对b另外赋值时不会影响a[0]的值


2)
vector <int*> a;
int *b;
b= new int[4];
b[0]=0;
b[1]=1;
b[2]=2;
a.push_back(b);
delete b;          //释放b的地址空间
for(int i=0 ; i <3 ; i++)
{
cout<<a[0]<<endl;
}
此时输出的值并不是一开始b数组初始化的值,而是一些无法预计的值.
                   
分析:根据1) 2)的结果,可以想到:
在1)中,  往a向量中压入的是b的值,即a[0]=b,此时a[0]和b是存储在两个不同的地址中的.因此改变b的值不会影响a[0];
而在2)中,因为是把一个地址(指针)压入向量a,即a[0]=b,因此释放了b的地址也就释放了a[0]的地址,因此a[0]数组中存放的数值


也就不得而知了.


/*****************************************************************************************/


/*对于一维vector的定义*/
#include<stdio.h>
#include<vector>
#include <iostream>


using namespace std;


int main(void)
{
   int i = 0;
    vector<int> v;


    for( i = 0; i < 10; i++ )
   {
             v.push_back( i );//把元素一个一个存入到vector中
   }


    /* v.clear()*/ 对存入的数据清空
   for( i = 0; i < v.size(); i++ )//v.size() 表示vector存入元素的个数
   {
          cout << v[ i ] << "  "; //把每个元素显示出来
   }
   cont << endl;
return 0;
}


注:你也可以用v.begin()和v.end() 来得到vector开始的和结束的元素地址的指针位置。
你也可以这样做:
vector<int>::iterator iter; /*iterator 抽象了指针的绝大部分基本特征*/


for( iter = v.begin(); iter != v.end(); iter++ )
{
    cout << *iter << endl;
}


/*****************************************************************************************/


/*对于二维vector的定义*/
#include<stdio.h>
#include<vector>
#include <iostream>


using namespace std;


int  main(void)
{
 int i = 0, j = 0;
//定义一个二维的动态数组,有10行,每一行是一个用一个vector存储这一行的数据。
//所以每一行的长度是可以变化的。之所以用到vector<int>(0)是对vector初始化,否则不能对vector存入元素。
 vector<vector<int> > Array(10, vector<int>(0));


for( j = 0; j < 10; j++ )
 {
  for ( i = 0; i < 9; i++ )
  {
   Array[j].push_back(i);
  }
 }


 for( j = 0; j < 10; j++)
 {
  for( i = 0; i < Array[j].size(); i++)
  {
   cout << Array[ j ][ i ] << "  ";
  }
  cout<< endl;
 }


 return 0;
}



/*****************************************************************************************/


/*定义一个行列都是变化的数组*/
#include<stdio.h>
#include<vector>
#include <iostream>


using namespace std;


int main(void)
{
 int i = 0, j = 0;


 vector< vector<int> > Array;
 vector< int > line;


 for( j = 0; j < 10; j++ )
 {
  Array.push_back( line );//要对每一个vector初始化,否则不能存入元素。
  for ( i = 0; i < 9; i++ )
  {
   Array[ j ].push_back( i );
  }
 }



 for( j = 0; j < 10; j++ )
 {
  for( i = 0; i < Array[ j ].size(); i++ )
  {
   cout << Array[ j ][ i ] << "  ";
  }
  cout<< endl;
 }


 return 0;
}



/*****************************************************************************************/


#include <iostream>
#include <vector>
#include <string>
#include <cstring>
#include <list>
#include <algorithm>    //to use remove_if
using namespace std;



typedef vector<int> V;
typedef vector<int>::iterator VIT;
typedef list<int> L;
typedef list<int>::iterator LIT;
V v;
L lis;



class InList
{
public:
        InList(list<int> &lis):li(lis){}
        bool operator()(int n)
        {
                return find(li.begin(), li.end(), n)!=li.end();
        }
private:
        list<int> &li;
};


/*****************************************************************************************/
int main()
{
 int i;
        for(i=0; i<10; ++i) // 初始化v: 0 1 2 3 4 5 6 7 8 9
                v.push_back(i);
        for(i=0; i<5; ++i)  // 初始化lis:0 1 2 3 4
                lis.push_back(i);


        VIT it;
        //cout<<endl<<v.end()-v.begin()<<endl;  //vector容器的iterator是支持加减操作的,这在其他类型的迭代器中很


少见


#ifdef DEMO1
        //遍历删除v中不等于3的元素的正确方法
        for(it=v.begin(); it!=v.end();)
        {
                if(*it != 3)
                {
                        //将it赋值为erase()的返回值,它指向the new location of the element that followed the last


element erased
                        it = v.erase(it);
                }
                else
                        ++it;
        }
        for(it=v.begin(); it!=v.end(); ++it)
                cout<<*it<<endl;
#endif


#ifdef DEMO2
        //DEMO2的功能: 在v中,删除那些在v和在lis中同时存在的元素,不使用remove_if
        it = v.begin();
        VIT del = it;
        for(; it!=v.end(); ++it)
        {
                if(find(lis.begin(),lis.end(),*it) == lis.end())
                {
                        *del++ = *it;
                }
        }//此时,del指向A iterator pointing to the new end of the sequence,which now includes all the elements


which is not in lis.
         //整个v变为 5 6 7 8 9 5 6 7 8 9,其中,del指向第二个5
        v.erase(del, v.end());
        for(it=v.begin(); it!=v.end(); ++it)
                cout<<*it<<endl;
#endif


#ifdef DEMO3
        //DEMO2的功能: 在v中,删除那些在v和在lis中同时存在的元素,使用remove_if


        /*
        //如果先单独运行remove_if,则v会变为5 6 7 8 9 5 6 7 8 9
        //即其前五个值由0 1 2 3 4 变为5 6 7 8 9,这与remove_if的实现有关
        remove_if(v.begin(), v.end(), InList(lis));
        for(it=v.begin(); it!=v.end(); ++it)
                cout<<*it<<endl;
        */


        //remove_if的返回值是A forward iterator pointing to the new end of the sequence,
        //which now includes all the elements for which InList(lis) was false.
        v.erase(remove_if(v.begin(), v.end(), InList(lis)), v.end());
        for(it=v.begin(); it!=v.end(); ++it)    //此时v变为5 6 7 8 9, 0 1 2 3 4被删除
                cout<<*it<<endl;
#endif


        return 0;
}
/*****************************************************************************************/
#include <vector>
#include <iostream>


int main(void)
{
         using namespace std;
         vector<int> v;
         v.push_back(6);  
         v.push_back(7);
         v.push_back(8);
         v.push_back(10);



         for(int i = 0; i < v.size(); i++)   
                cout << "v[" << i << "] = " << v << endl;
         cout<<endl<<endl;
         v.insert(v.begin() + 3, 9);  //在元素10的前面插入9
         v.insert(v.begin(), 5);      //插入5为首元素
         v.insert(v.end(), 11);       //插入11为末元素


         cout<<endl<<endl;
         for( i = 0; i < v.size(); i++)   
                  cout << "v[" << i << "] = " << v << endl;


        vector <int>::iterator iter,iend;
        int j;
        iend = v.end();


         cout<<endl<<endl;


        for(iter= v.begin(),j=0;iter!=iend;iter++,j++)
        {
                cout<<"v["<<j<<"]="<<*iter<<endl;
        }


        iter = v.begin();


        v.erase(iter+2);                                                                   //(1)


        //v.erase(iter+2,iend);                                                            //(2)


         cout<<endl<<endl;


        for(iter= v.begin(),j=0;iter!=iend;iter++,j++)
        {
                cout<<"v["<<j<<"]="<<*iter<<endl;
        }


         cout<<endl<<endl;
         for(/*int*/ i = 0; i < v.size(); i++)   
        {
                  cout << "v[" << i << "] = " << v << endl;
        }


         return 0;
}


(1)打印信息:


v[0] = 6
v[1] = 7
v[2] = 8
v[3] = 10



v[0] = 5
v[1] = 6
v[2] = 7
v[3] = 8
v[4] = 9
v[5] = 10
v[6] = 11



v[0]=5
v[1]=6
v[2]=7
v[3]=8
v[4]=9
v[5]=10
v[6]=11



v[0]=5
v[1]=6
v[2]=8
v[3]=9
v[4]=10
v[5]=11         //不知道为什么
v[6]=11



v[0] = 5
v[1] = 6
v[2] = 8
v[3] = 9
v[4] = 10
v[5] = 11
Press any key to continue


(2)打印信息


v[0] = 6
v[1] = 7
v[2] = 8
v[3] = 10



v[0] = 5
v[1] = 6
v[2] = 7
v[3] = 8
v[4] = 9
v[5] = 10
v[6] = 11



v[0]=5
v[1]=6
v[2]=7
v[3]=8
v[4]=9
v[5]=10
v[6]=11



v[0]=5
v[1]=6
v[2]=7
v[3]=8             //不知道为什么
v[4]=9
v[5]=10
v[6]=11



v[0] = 5
v[1] = 6
Press any key to continue


查资料才知道
资料:
http://topic.csdn.net/u/20080909/20/a3b94068-eb76-4963-8bf8-7c9bebe1f9e0.html


可能有不少人用Vector时,没太注意其iterator的用法,当Vector中的元素个数改变时,会引起iterator的一些error,看看下面


代码,体会一下,会令你豁然开朗的


void main()
{
    vector<int> member;
    member.push_back(1);
    member.push_back(2);
    member.push_back(2);
    member.push_back(3);
    member.push_back(1);
    member.push_back(2);
    member.push_back(4);


    vector<int>::iterator iter;


    for(iter = member.begin(); iter != member.end(); iter++)
       
cout<<*iter<<endl;


    cout<<"do erase--------"<<endl;


    for(iter = member.begin();


        iter != member.end();iter++)


    {
        if(*iter == 2)
        {
            member.erase(iter);
        }
    }
    for(iter = member.begin();


        iter != member.end();iter++)


        cout<<*iter<<endl;
}


咋一看,这不是和上面提到的第一种方法一样吗?貌似没有问题啊。可是,要注意到,调用erase后,回到for循环又继续使用迭


代器,并执行++运算。
好,让我们再温习一下erase函数的说明:


iterator erase ( iterator position );


iterator erase ( iterator first, iterator last );


现在我们只关注函数执行后的副作用和返回值。函数调用后使指向position和first之后的所有迭代器失效。返回值则是一个指


向删除的最后一个元素后面的元素的迭代器。所以上面代码中的iter在调用erase后就无效了,我在VS2005中测试了,确实崩溃


在++的操作上。


要解决这个问题,我们只需弃用原来的迭代器,使用返回值即可,代码如下:


for(iter = member.begin(); iter != member.end();)


{
    if(*iter == 2)
    {
        iter = member.erase(iter);
    }
    else
    {
        iter++;
    }
}


1/**//*
2(C) C++ STL_study:http://hi.baidu.com/2008rightman
3
4Filename    : VectorFindAndErase.cpp
5Compiler    : Visual C++ 8.0
6Description : Demo how to erase iterator in a RIGHT way.
7Release     : 11/14/2006
8*/
9#include <iostream>
10#include <vector>
11#include <algorithm>
12
13int main() {
14 const int iaSize = 11;
15 int ia[] = {0, 1, 1, 2, 3, 5, 8, 13, 21, 55, 89};
16
17 std::vector<int> ivec;
18 ivec.insert(ivec.end(), ia, ia + iaSize);
19
20 // Compile OK, but run-time error!!
21 // for(std::vector<int>::iterator iter = ivec.begin();
22 // iter != ivec.end(); ++iter) {
23 //    if (*iter == 8) {
24 //      ivec.erase(iter);
25 //    }
26 // }
27
28 // This is a RIGHT way to do it.
29 std::vector<int>::iterator iter = find(ivec.begin(), ivec.end(), 8);
30 if (iter != ivec.end()) {
31    ivec.erase(iter);
32 }
33
34 // cout the result
35 for(std::vector<int>::const_iterator iter = ivec.begin();
36    iter != ivec.end(); ++iter) {
37
38      std::cout << *iter << std::endl;
39 }
40
41 return 0;
42}
/*****************************************************************************************/

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
6
关闭 站长推荐上一条 /3 下一条