代码改变世界

读书笔记:C++ Primer系列(6)—— 标准库类型之vector

2013-12-22 19:14  Keiven_LY  阅读(312)  评论(0编辑  收藏  举报

 题记:

  继上一篇标准库类型string后,本篇继续讲述标准库类型中的容器(vector)。

6.1 标准库vector类型

  • vector称为容器,是同一种类型的对象的集合,每个对象都有一个对应的整数索引值
  • 一个容器中的所有对象都必须是同一种类型
  • 使用vector之前,必须包含相应的头文件,即:

                      #include <vector>

                      using std::vector;

  • vector是一个类模版(class template)——使用模版可以编写一个类定义或函数定义,而用于多个不同的数据类型,但vector不是一种数据类型
  • 声明从类模版产生的某种类型的对象,需要提供附加信息,信息的种类取决于模版,如:

                      vector<int>  ivec;  //定义ivec为含有若干int类型对象的vector

  • 由于vector类型的每一种都指定了其保存元素的类型,因此像vector<int>,vector<string>等都是数据类型

6.2 vector对象的定义和初始化

6.2.1 vector对象的定义和初始化

                      表6-1  vector对象的几种初始化方式

  • 对于vector保存内置类型的元素,标准库将用0值初始化所有的成员

                 如:vector<int> ivec(10);  //这里10个整型的成员均初始化为0

                       vector<string> svec(10); //这里的10个元素均为空字符串

  • 如果vector保存的是类类型,标准库将调用类的默认构造函数来初始化每一个数据成员;
  • 如果类中定义了构造函数,但没有提供默认构造函数,初始化这种类型的vector对象时,除了提供vector对象所含的元素个数外,还必须指定每个元素的初始值

                如:vector<int> ivec1(10,1);//这里10个整型的成员均初始化为1

                      vector<int> ivec2(ivec1); //这里的ivec2是ivec1的一个副本

                      vector<string> ivec3(ivec1); //错误,两个vector对象的类型必须一致

                      vector<string> ivec4(10, "hello"); //ivec4对象包含10个元素,均为“hello”字符串

注:vector对象的一个重要属性:可以在运行时高效地添加元素。

      因此虽然可以对给定元素个数的vector对象预先分配内存,但更有效的方法是先初始化一个空vector对象,然后再动态地增加元素。(这一点比较重要)

6.2.2 vector对象的操作

                         表6-2 vector对象的几种操作

  • vector对象的size和empty操作与string类型的相关操作类似,函数返回相应的vector类定义的size_type的值

注:使用size_type类型时,必须指出该类型是在哪里定义的。vector类型总是包括vector的元素类型。如下:

                                 vector<int>::size_type;  //正确

                                 vector::size_type;  //错误

程序清单—01

    vector<int> vec;
    for(vector<int>::size_type i=0;i!= 10;i++)
    {
        vec[i]=i;
        cout<<vec[i]<<endl;
    }

上述程序试图向vec中插入0到9的10个元素,但是运行出错,原因在于:vector对象的下标只能用于获取已存在的元素,而程序清单中vec对象默认为空。

程序清单—02

#include <iostream>  
#include <vector> //标准库string类型头文件  
 
using std::vector; //string类型的using声明  
using std::cin;  
using std::cout;  
using std::endl;  

int main()
{    
    cout<<"方法1:这里初始化一个包含10个0的vector对象"<<endl;
    vector<int> vec(10,0);
    for(vector<int>::size_type i=0;i!= 10;i++)
    {
        vec[i]=i;
        cout<<vec[i]<<endl;
    }
    if(vec.empty())
    {
        cout<<"容器vec是空的!"<<endl;
    }


    //方法2:使用push_back()函数
    cout<<"方法2:使用push_back()函数"<<endl;
    vector<int> vec_new;
    for(vector<int>::size_type i=0;i!= 10;i++)
    {
        vec_new.push_back(i);
        cout<<vec_new[i]<<endl;
    }

    if(vec_new.empty())
    {
        cout<<"容器vec_new是空的!"<<endl;
    }
  
    system("pause");
    return 0;
}

程序结果: