🍓标准库类型vector
2022-5-1
| 2023-8-2
0  |  阅读时长 0 分钟
type
status
date
slug
summary
tags
category
icon
password
Property
 

 
标准库类型vector表示对象的集合,也叫做容器,定义在头文件vector中。vector中所有对象的类型都相同,每个对象都有一个索引与之对应并用于访问该对象。
C++中同时有类模板和函数模板,vector 是一个类模板。模板本身不是函数或者类,但是当提供实例化参数时,编译器会帮助生成新的函数或者类,这个过程叫做实例化
实例化参数包含在模板名称后的尖括号中,如:vector<int> 和vector<vector<string>> ,可以将 vector实例化为包含绝大多数类型,甚至元素可以是 vector
注:早期的C++标准中,如果vector的元素还是vector(或者其他模板类型),则其定义的形式与现在的C++11新标准略有不同。过去,必须在外层vector对象的右尖括号和其元素类型之间添加一个空格,如应该写成vector<vector<int> >而非vector<vector<int>>
 
vector 中的元素是顺序存储的,意味着元素不仅仅可以通过迭代器进行访问,并且可以使用元素指针的偏移进行访问。这就是说可以将vector元素的指针传递给一个期待数组元素指针的函数。
 

定义和初始化 vector

初始化 vector对象的方法:
notion image
可以默认初始化 vector对象,从而创建一个指定类型的空vector
空的vector 看起来没什么用,可其实是最常用的方式。惯用的方式是先定义一个空的 vector,然后在运行时不断添加元素。添加元素本身是一个高效的操作。
 
初始化 vector 对象时:
  • 如果使用圆括号,可以说提供的值是用来构造vector 对象
  • 如果使用的是花括号,则是在列表初始化vector 对象
 
当只提供个数而不提供初始值,vector会对元素进行值初始化,值初始化对于类类型是调用类的默认构造函数,对于内置类型则初始化为 0 。值初始化保证一定有值,而默认初始化对于类类型将调用类的默认构造函数,对于内置类型则在函数外初始化为 0 ,在函数内作为自动变量则是未定义值。
 
值初始化和默认初始化的一个有意思的例子是,在函数内定义数组,如果不进行初始化则为默认初始化,其中的所有元素都是未定义值,而如果提供少量的初始值,其它元素则执行值初始化为0 :
打印以上数组就会发现不同
 
如果类类型的元素没有默认构造函数,则无法定义只包含个数的vector。对于无法执行列初始化时,会转而直接调用构造函数:
为了达到列初始化,必须使得大括号中的值的类型与元素的类型匹配。
 

添加元素

vector使用 push_back 函数进行添加元素。对vector进行添加元素是非常高效的,通常,在C++中不会预先给 vector分配个数。
 
将一个元素添加到 vector 中,事实上是将其拷贝一份然后添加到vector中。
 
 
 

vector 的其它操作

vector 中包含另外一些类似于 string 类的成员函数:
notion image
vector和 string对象的下标运算符只能用来访问已经存在的元素,而不能用来添加元素
 
只能对确知已存在的元素执行下标操作:
 
size 函数返回的类型需要包含元素类型,如:vector<int>::size_type 。
字典比较的意思是依次比较向量中的每个元素,当遇到第一个不一致的元素时,较大的元素的向量较大,如果所有元素都是一样,则根据长度判断,较长的向量较大。只有当可以比较向量的元素值时可以比较向量。
vectorstring的下标运算一样,索引是size_type类型,是一个无符号整数,当索引超出范围时,其行为是未定义的。这种越界是非常常见而且难以定位的问题,称之为缓冲溢出(buffer overflow),但是C++并不试图阻止程序员这样做,甚至在标准库容器中也不阻止,stringvector的下标操作同样会产生未定义行为而不是抛出异常。
 
正确的添加方法是使用 push_back
 
 
  • C++
  • 标准库类型string迭代器
    目录