写点什么

Android C++ 系列:vector 最佳实践

作者:轻口味
  • 2022 年 4 月 27 日
  • 本文字数:1556 字

    阅读完需:约 5 分钟

Android C++系列:vector最佳实践

1. 背景介绍

Java 中常见的集合有 List、Set、Map 等,并且这些都是支持泛型的。类似的 C++中也提供了 vector 容器,并且 vector 是模板类(类似 Java 的泛型)。使用 vector 要用到的头文件:


#include <vector>using std::vector;
复制代码


C++中模板本身不是类,是编译器生成类或者函数的说明,要使用模板需要编译器根据模板来创建类的实例化过程,我们代码中使用的是类,所以在使用模板是,要指定编译器将模板实例化成那种类型。


跟 Java 类似,在模板后面用尖括号括起来的部分表示泛型要关联类型:vector<int>vector<string>vector<vector<int>>


**注意:**vector 可以容纳大部分类型的对象作为元素,但是引用不是对象,不存在包含引用的 vector。


早起版本 C++标准中,如果 vector 元素还是 vector 的话,定义形式与 C++11 标准有些区别:


  • 旧版本中必须在外层 vector 对象的右尖括号和其他元素类型之间添加一个空格:vector<vector<int> >

2. vector 初始化

常用的初始化方法:


//默认初始化,为空集合vector<int> v1;//拷贝初始化vector<int> v2(v1);//或者vector<int> v2 = v1;//包含值为val的n个重复元素vector<int> v3(n, val);//包含n个重复执行了之初始化的对象vector<int v4(n);//列表初始化//vector<int> v5{1,2,3,4};//或者 vector<int> v5={1,2,3,4};
复制代码


几种初始化可以相互等价使用,有三种特列需要说明:


  1. 使用拷贝初始化时,只能提供一个初始值:vector<int> v1 = v2;

  2. 如果是类内初始化值,则只能使用拷贝初始化或者花括号形式的列表初始化;

  3. 如果初始元素值是列表,则只能把初始值放在花括号中进行列表初始化,而不是放在圆括号中:vector<int> v1{1,2,3,4,5},不能是vector<int> v1(1,2,3,4,5);


我们再着重介绍一下列表初始化(用花括号括起来的 0 个或多个初始元素值被赋给 vector 对象)。


10 个 int 类型的元素,每个都被初始化为 1:


vector<int> v(10,-1);
复制代码


只提供 vector 对象容纳的元素数量而略去每个元素的初始值:


//10个元素,每个元素初始化为0vector<int> v1(10);//20个元素,每个元素都是空字符串vector<string> v2(10);
复制代码


vector 容纳的是内置类型,像 int 初始值会自动设置为 0,如果是某种类型,像上面 string,由类默认进行初始化。如果是类类型,要求这些类必须明确提供初始值,如果不支持默认初始化,就必须由我们提供初始值。


具体是列表初始值还是元素数量:


vector<int> v1(10);//10个元素,每个元素值都是0vector<int> v2{10};//1个元素,元素值为10vector<int> v3(10,1);//10个元素,每个值都是1vector<int> v4{10,1};//2个元素,值分别是10和1
复制代码


概括一下,圆括号是提供值来构造,花括号是列表初始化。

3. vector 添加元素

我们使用 vector 最常用的场景是初始化一个空的 vector,然后根据业务场景给 vector 动态添加元素,或者初始化为空 vector,通过循环给 vector 添加元素。


vector 提供了 push_back 函数像 vector 对象的尾部添加元素。


**注意:**如果循环体内部包含向 vector 对象添加元素的语句,不能使用范围 for 循环。

4. vector 其他操作

与 string 类型,vector 提供了以下操作:


  • empty:是否为空

  • size:获取元素个数

  • [] :返回第 n 个位置上元素

  • = : 拷贝

  • ==: 比较,只有元素数量相同,元素内容相同,切顺序保持一致时相等


这里注意:


  • size 返回的也是 vector 中定义的的 size_type,但是使用时不能用模板vector::size_type,而要指明具体类类型:vector<int>::size_type

  • 不能用下标运算符给 vector 添加元素。下标运算符只能访问已存在的元素,而不能用于添加元素。

  • 只能对明确存在的元素执行下标操作,试图用下标的形式访问一个不存在的元素将引发错误,编译器不会检查这种错误,只会在运行时产生位置错误,比如缓存区溢出错误。

5. 总结

本文介绍了 C++标准库中最常用的集合类 vector,并介绍了泛型相关一些知识,以及 vector 初始化,vector 添加元素,vector 其他常用操作及注意事项等。

发布于: 2022 年 04 月 27 日阅读数: 31
用户头像

轻口味

关注

🏆2021年InfoQ写作平台-签约作者 🏆 2017.10.17 加入

Android、音视频、AI相关领域从业者。 欢迎加我微信wodekouwei拉您进InfoQ音视频沟通群 邮箱:qingkouwei@gmail.com

评论

发布
暂无评论
Android C++系列:vector最佳实践_c++_轻口味_InfoQ写作社区