C++系统学习之三:向量

标准库类型vector

定义:vector表示对象的集合,其中所有对象的类型都相同。

访问方式:索引

头文件:<vector>

本质:类模板

NOTE:

  • 模板本身不是类或函数,相反可以将模板看作为编译器生成类 或函数编写的一份说明。
  • vector是模板而非类型,由vector生成的类型必须包含vector中元素的类型,例如vector<int>
  • vector只能容纳实体对象,不能容纳引用

1 定义和初始化vector对象

 

也允许把一个vector对象的元素拷贝给另外一vector对象,但两个vector对象的类型必须相同。

 列表初始化vector对象

  C++提供的几种不同的初始化方式,大多数情况下这些初始化方式可以相互等价地使用,但有三种特殊情况:

  • 使用拷贝初始化时,只能提供一个初始值
  • 如果提供的是一个类内初始值,则智能使用拷贝初始化或使用花括号的形式初始化
  • 如果提供的是初始元素值的列表,则只能把初始值都放在花括号里进行列表初始化,而不能放在圆括号里
vector<string> v1("a","an","name");    //错误
vector<string> v2{"a","an","name"};    //列表初始化

创建指定数量的元素

vector<int> v(10,-1);    //10个-1
vector<string> s(10,"hi");    //10个string的hi

值初始化

  通常情况下,可只提供vector对象容纳的元素数量而不用初始值,库会为每一个元素提供一个初始化值,这个值由vector中对象的类型决定。

vector<int> v(10);    //10个元素,每个初始化为0
vector<string> s(10);    //10个元素都初始化为空字符

NOTE:

  初始化时,圆括号是用来构造vector对象的,如果是花括号则表示是列表初始化,但是如果无法执行列表初始化时将会考虑其他初始化方式。

vector<int> v1(10);    //v1有10个元素,每个值为0
vector<int> v2{10};    //v2有1个元素,该元素的值是10

vector<int> v3(10,1);    //v3有10个元素,每个元素的值都是1
vector<int> v4{10,1};    //v4有2个元素,值分别是10和1

vector<string> v6("hi");  //错误,不能使用字符串字面值构件vector对象
vector<string> v7{10};  //此时不能执行列表初始化,所以是直接初始化,v7有10个默认初始化的元素

2、向vector对象中添加元素

  利用成员函数push_back();

3、其他vector操作

NOTE:

  使用下标访问元素,必须要确保下标的合法性,只能对已经存在的元素执行下标操作,确保下标合法的一个有效手段就是尽可能使用范围for语句。

    vector<int> v{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    for (auto &i : v)
    {
        cout << i << endl;
    }

迭代器

  除了使用下标来访问string对象的字符和vector对象的元素之外,还可以使用迭代器来达到同样的效果。

  • 所有标准容器都可以使用迭代器,但只有少数几种才同时支持下标运算符

使用迭代器

  迭代器和指针类似,都提供了对对象的间接访问,但也有区别。获取迭代器不是取地址符,有迭代器的类型同时拥有返回迭代器的成员。

  • 如果容器为空,则begin和end返回的是同一个迭代器,都是尾后迭代器
  • 使用auto来定义接收迭代器函数返回的迭代器类型
auto b=v.begin(), e=v.end();

迭代器运算符

迭代器相等的判定原则:两个迭代器指向的元素相同或者都是同一个容器的尾迭代器,则相等。

 迭代器类型

  iterator和const_iterator来表示迭代器的类型。const_iterator能读取但不能修改它所指的元素值。如果vector对象或string对象是一个常量,只能使用const_terator;如果vector对象或string对象不是常量,那么既能使用iterator也能使用const_iterator。

begin和end运算符

  begin和end返回的具体类型由对象是否是常量决定,如果对象是常量,begin和end返回const_iterator,如果对象不是常量,返回iterator.

vector<int> v;
cosnt vector<int> cv;
auto it1=v.begin();    //it1的类型是vector<int>::iterator
auto it2=cv.begin();    //it2的类型是vector<int>::const_iterator

  C++新标准引入了两个新函数,分别是cbegin和cend,不论对象本身是否是常量,返回值都是const_iterator.

 结合解引用和成员访问操作

(*it).men
it->men    //二者效果一样

某些对vector对象的操作会使迭代器失效

  • 不能在范围for循环中向vector对象添加元素
  • 任何一种可能改变vector对象容量的操作,都会使vector对象的迭代器失效

 迭代器运算

 

posted @ 2018-08-07 18:12  jameshater  阅读(237)  评论(0编辑  收藏  举报