zoukankan      html  css  js  c++  java
  • C++ vector是什么?应该如何理解

    http://hi.baidu.com/phpok/item/b2df4db0ab6925f262388eab

    最近有几个好友问到我C++中的vector到底怎么理解它,很多人没有接触过它。一时间都被搞的晕头转向。其实vector很好理解,它就是可以动态创建对象元素个数的数组。如果你不知道什么是数组那就别浪费时间看下去。因为在C++中数组元素个数的定义只能够使用常量值,或在编译时就可以获得的值。列如

    const int ay=5; int array[ay];

    或者

    int array[5];

    不可以使用

    int ay; int array[ay];

    这种定义的方式。所以,数组元素的个数在C++中除了使用NEW表达式(比较麻烦)之外是不可以动态定义的。那么如何解决这个问题呢。

    C++推出了标准库vector

    在使用它的时候需要首先引头文件

    #include <vector> using std::vector;

    接下来用几个简单的列子来说明它和数组的区别。

    01  /********************************************************************

    02       创建时间:      2009/09/21 21:11

    03       文件名称:      test1.cpp

    04       文件后缀:      cpp

    05       文件作者:      QianLiang

    06   07       =====================================================

    08       功能说明:      说明什么是vector以及它与数组的区别

    09       -----------------------------------------------------------------

    10       其他说明:     

    11   *********************************************************************/

    12  #include <iostream>

    13  #include <vector>

    14  using namespace std;

    15  

    16  int main()

    17   {

    18      /* 数组:静态定义元素个数 */

    19       const int ay=5;

    20      int   array1[ay];

    21  

    22      /* vector:动态定义元素个数 */

    23      int     vy;

    24       cin>>vy;

    25      vector<int>     ivec1(vy);

    26  

    27      /* 测试它们每个元素的默认值,这里假设上面的vy输入为5 */

    28      for (int i=0;i<ay;++i)

    29       {

    30           cout<<"数组:\t"<<array1[i]<<endl; //它输出的全是随即数

    31           cout<<"vector:\t"<<ivec1[i]<<endl;//它将全部元素初始化为0

    32           cout<<endl; 33       }

    34  

    35      /* 测试他们的赋值安全性 */

    36      int array2[6];

    37      //array1=array2;    ←这条语句就是错误的.而

    38      vector<int>     ivec2(3);

    39       ivec1=ivec2; //这条语句是正确的因为它可以动态的确定元素个数

    40  

    41 

      42      /* 仅仅以上三条测试就足以说明使用vector比数组要安全的多,

    43          第一它是动态的管理元素个数,这就避免了许多越界问题的发生

    44          第二当未对它们进行初始化操作的时候vector会自动为每个元素添加

    45          该类型的安全默认值.这也避免了若干问题的发生.

    46  

    47       接下来看看vector的使用,它有4个构造函数

    48       vector<T> v1;         ←vector保存类型为T的对象.默认构造函数v1为空

    49       vector<T> v2(v1);     ←V2是V1的一个副本.

    50       vector<T> v3(n,i);     ←v3包含n个值为i的元素.

    51       vector<T> v4(n);     ←v4含有值初始化的元素的n个副本.*/

    52  

    53      /* vector的操作 */

    54       cout<<ivec1.empty();//如果ivec1为空则返回true(1),否则返回false(0)

    55       cout<<ivec1.size();//返回ivec1中元素的个数;

    56       ivec1.push_back(t) //在ivec1的末尾增加一个值为t的元素.

    57  

    58      return 0;

    59   }

    什么时候使用vector什么时候使用数组呢?

    **由于vector是标准库,而数组则是内置类型。所以如果你追求程序的执行效率的话那就用数组吧。 **可确定数组元素个数的时候尽量使用数组。 **对于指针以及NEW操作符迷糊的时候使用vector,因为它内置有内存管理器。

    下面是一个关于vector的编程习题。

    01  /********************************************************************

    02       创建时间:      2009/09/21 21:18

    03       文件名称:      习题3-13.cpp

    04       文件后缀:      cpp

    05       文件作者:      QianLiang

    06  

    07       =====================================================

    08       功能说明:      读一组整数到vector对象,计算并输出每对相邻元素的和.如

    09                    果读入元素个数为奇数,则提示用户最后有一个元素没有求和

    10                    ,并输出其值.然后修改程序:首尾元素两两配对(第一个和最

    11                    后一个,第二个和倒数第二个,以次类推),计算每对元素的和

    12                    并输出.

    13       -----------------------------------------------------------------

    14       其他说明:    

      15   *********************************************************************/

    16  #include <iostream>

    17  #include <vector>

    18  using namespace std;

    19  

    20  int main()

    21   {

    22      vector<int>     ve;

    23      int     a(0);

    24       const    int     CI(2);

    25  

    26       cout<<"输入整数,程序计算它们相邻数的和.输入0时程序开始计算"<<endl;

    27      /* 请求用户输入整数,每个数字为ve的一个元素,如果用户输入0

    28          程序将停止请求*/

    29      while (cin>>a && a!=0)

    30       {

    31           ve.push_back(a);

    32       }

    33  

    34      /* 统计ve的元素个数减1后赋给变量b */

    35      int b(ve.size()-1);

    36  

    37      /* 判断用户是否直接输入了0,或是键盘上的任意键 */

    38      if (ve.size()==0)

    39       {

    40           cout<<"无元素"<<endl;

    41       }

    42  

    43      /* 判断用户输入元素的个数是否为奇数 */

    44      else if (ve.size()%CI != 0)

    45       {

    46          /* 判断用户是否只输入了一个数字 */

    47          if (ve.size()==1)

    48           {

    49               cout<<"一个元素无法计算"<<endl;

    50           }

    51          else

    52           {

    53               cout<<"您输入的元素个数是奇数,最后一个数字无法相加"<<endl;

    54              for (int i=0;i<b;i+=CI)

    55               {

    56                   cout<<"第"<<i+1<<"组数:"<<ve[i]+ve[i+1]<<endl;

    57               }

    58  

    59               cout<<"您输入的最后一个元素为:"<<ve[b]<<endl;

    60           }

    61       }

    62  

    63      /* 判断用户输入的元素个数是否为偶数 */

    64      else if (ve.size()%CI == 0)

    65       {

    66          for (int i=0;i<b;i+=CI)

    67           {

    68               cout<<"第"<<i+1<<"组数:"<<ve[i]+ve[i+1]<<endl;

    69           }

    70       }

    71

       72      return     0;

    73   }

  • 相关阅读:
    SAP training scope SAP从入门到精通课程体系
    萨提亚·纳德拉
    说说为什么不再写博客了
    课上用过的Linux命令
    中国商用密码生产企业和商用密码产品及标准
    在Python中运行gmssl
    基于CMPP协议集成短信测试桩全流程实践分享 做梦的人
    mysqlslap: Error when connecting to server: 1064 Reach limit of connections 做梦的人
    大数据清洗表中没有找到对应表 做梦的人
    自动生成镜像,在上传到仓库 做梦的人
  • 原文地址:https://www.cnblogs.com/yaowen/p/2861894.html
Copyright © 2011-2022 走看看