恶补Cpp系列——标准vector类型

从今天开始每个工作日将会推出一个“恶补Cpp系列”专题。由于现在楼猪我个人的原因需要恶补c++编程,俗称少壮不努力老大徒伤悲啊。。。这专题是我的一个复习笔记,希望放到博客上能帮到需要使用c++的大家,特别是初学者和准备找工作的同学。

 

1 vector概述

vector是C++标准程序库中的一个类,可视为会自动扩展容量的数组,以循序(Sequential)的方式维护变量集合。

vector的特色有支持随机存取,在集合尾端增删元素很快,但是在集合中间增删元素比较费时。

vector是C++标准程序库中的众多容器(container)之一。

vector以模板(泛型)方式实现,可以保存任意类型的变量,包括用户自定义的数据型态,例如:它可以是放置整数(int)型态的 vector、也可以是放置字符串(string)型态的 vector、或者放置用户自定类型(user-defined class)的 vector。所以,在编程术语上面称vector是一个类模版(class template)。

 

 

2 vector对象的定义和初始化

 

2.1 所需的头文件

使用vector之前必须包含相应的头文件。

#include 

或者

using std::vector;

 

2.2 定义和初始化

 

2.2.1 定义

//vector保存类型为T的对象

vector v1; //默认构造函数v1为空;

vector v2(v1);//v2是v1的一个副本;

vector v3(n,i);//v3包含n个值为i的元素;

vector v4(n); //v4含有值初始化的元素的n个副本;

/*注意:

1.若要创建非空的vector对象,必须给出初始化元素的值。

2.当使用对象复制的方式创建对象的时候,必须保证两个的vector对象同一个元素类型。

*/

 

2.2.2 值初始化

1.如果没有指定元素初始化式,标准库自行提供一个初始化值进行值初始化(这个由库生成的初始值将用来初始化容器中的每一个元素,具体是什么将取决于存储在vector中元素的数据类型)。

例:

vector vec_sample(10); //创建10个元素,每个元素初始化为0.

2.如果保存的式含有构造函数的类类型的元素,标准库使用该类型的构造函数初始化。

例:

vector vec_sample(10); //创建10个元素,每个元素初始化为””(空字符串).

3.如果保存的式没有构造函数的类类型的元素,标准库产生一个带初始值的对象,使用这个对象进行值初始化。

 

3 vector对象的操作

  • 访问元素的方法
    • vec[i] - 访问索引值为 i 的元素引用。 (索引值从零起算,故第一个元素是vec[0]。) 注意:对数组进行下标操作的时候必须是已经存在的下标操作符。通过下标操作不能也不会添加任何元素。
    • vec.at(i) - 访问索引值为 i 的元素的引用,以 at() 访问会做数组边界检查,如果访问越界将会抛出一个例外,这是与operator[]的唯一差异。
    • vec.front() - 回传 vector 第一个元素的引用。
    • vec.back() - 回传 vector 最尾元素的引用。
  • 新增或移除元素的方法
    • vec.push_back() - 新增元素至 vector 的尾端,必要时会进行存储器配置。
    • vec.pop_back() - 删除 vector 最尾端的元素。
    • vec.insert() - 插入一个或多个元素至 vector 内的任意位置。
    • vec.erase() - 删除 vector 中一个或多个元素。
    • vec.clear() - 清空所有元素。
  • 取得长度/容量
    • vec.size() - 取得 vector 目前持有的元素个数。
    • vec.empty() - 如果 vector 内部为空,则传回 true 值。
    • vec.capacity() - 取得 vector 目前可容纳的最大元素个数。这个方法与存储器的配置有关,它通常只会增加,不会因为元素被删减而随之减少。
  • 重新配置/重设长度
    • vec.reserve() - 如有必要,可改变 vector 的容量大小(配置更多的存储器)。在众多的 STL 实做,容量只能增加,不可以减少。
    • vec.resize() - 改变 vector 目前持有的元素个数。
  • 迭代 (Iterator) (迭代器是一种检查容器内元素并遍历元素的数据结构类型。)
    • vec.begin() - 回传一个Iterator,它指向 vector 第一个元素。
    • vec.end() - 回传一个Iterator,它指向 vector 最尾端元素的下一个位置(请注意:它不是最末元素,一般是超出末端的,表明指向一个不存在的元素,如果vector为空,begin返回的迭代器与end返回的迭代器相同)。
    • vec.rbegin() - 回传一个反向Iterator,它指向 vector 最尾端元素的。
    • vec.rend() - 回传一个Iterator,它指向 vector 的第一个元素。
  • 符号
    • vec1=vec2 - 把vec1的元素替换为vec2中元素的副本。
    • vec1==vec2 - 判断vec1与vec2是否相等。
    • !=、<、<=、>、>= 保持这些操作符惯有含义。

 

4 vector的迭代器类型

由于我觉得这方面的难度对于初学来说是挺大的,所以我将这单独一章。

 

每种容器类型都定义了自己的迭代类型。在vector类型中是如此定义的:

vector::iteratoriter;

每个标准库容器类型都定义了一个名字为iterator的成员,这里的iterator与迭代器实际的类型含义是一样的。

 

//用例子学习迭代器1

//vector::begin/end

#include

#include

 

int main ()

{

  std::vector myvector;

  for (int i=1; i<=5; i++)myvector.push_back(i);

 

  std::cout << "myvectorcontains:";

  for (std::vector::iterator it =myvector.begin() ; it != myvector.end(); ++it)

    std::cout << ' ' << *it;

  std::cout << '\n';

 

  return 0;

}

 

//用例子学习迭代器2:循环的简单实现

//以下两个循环等价

for(vector::size_typeix=0; ix!=ivec.size(); ++ix)

{

                   ivec[ix]=0;

}

 

for(vector::iteratoriter= ivec.begin(); iter!= ivec.end(); ++iter)

{

                   *iter=0; //迭代器类型可以使用解引用操作符来访问迭代器所指向的元素

}


 

 

 

值得注意的const_iterator

前面的程序用vector::iterator改变vector中的元素值。每种容器类型还定义了一种名为const_iterator的类型,该类型只能用于读取容器内元素,但不能改变其值。(即迭代器自身的值可以改变,但不能用来改变其所指向的元素的值。

 

注意:任何改变vector长度的操作都会使已经存在的迭代器失效。例如使用push_back之后,就不能相信指向vector的迭代器的值。

 

可能本人才疏学浅有些问题说不清楚,大家可以看看这个网站http://www.cplusplus.com/reference/vector/vector/,挺好的,方便CPP学习。

 

 

 

 

参考文献

[1]维基百科. Vector (STL). http://zh.wikipedia.org/wiki/Vector_%28STL%29,,2014-1-9.

[2]Stanley B.Lippman, Josée Lajoie, BarbaraE. Moo. C++ Primer 中文版[M]. 北京, 人民邮电出版社, 2010: 78-88.

你可能感兴趣的:(C/C++)