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

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

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个元素,每个元素初始化为0
vector<int> v1(10);
//20个元素,每个元素都是空字符串
vector<string> v2(10);


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


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


vector<int> v1(10);//10个元素,每个元素值都是0
vector<int> v2{10};//1个元素,元素值为10
vector<int> v3(10,1);//10个元素,每个值都是1
vector<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其他常用操作及注意事项等。

目录
相关文章
|
移动开发 监控 Android开发
Android & iOS 使用 ARMS 用户体验监控(RUM)的最佳实践
本文主要介绍了 ARMS 用户体验监控的基本功能特性,并介绍了在几种常见场景下的最佳实践。
951 106
|
2月前
|
开发工具 Android开发
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
483 11
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
|
8月前
|
监控 Shell Linux
Android调试终极指南:ADB安装+多设备连接+ANR日志抓取全流程解析,覆盖环境变量配置/多设备调试/ANR日志分析全流程,附Win/Mac/Linux三平台解决方案
ADB(Android Debug Bridge)是安卓开发中的重要工具,用于连接电脑与安卓设备,实现文件传输、应用管理、日志抓取等功能。本文介绍了 ADB 的基本概念、安装配置及常用命令。包括:1) 基本命令如 `adb version` 和 `adb devices`;2) 权限操作如 `adb root` 和 `adb shell`;3) APK 操作如安装、卸载应用;4) 文件传输如 `adb push` 和 `adb pull`;5) 日志记录如 `adb logcat`;6) 系统信息获取如屏幕截图和录屏。通过这些功能,用户可高效调试和管理安卓设备。
|
9月前
|
算法 编译器 C++
模拟实现c++中的vector模版
模拟实现c++中的vector模版
|
12月前
|
存储 编译器 C语言
【c++丨STL】vector的使用
本文介绍了C++ STL中的`vector`容器,包括其基本概念、主要接口及其使用方法。`vector`是一种动态数组,能够根据需要自动调整大小,提供了丰富的操作接口,如增删查改等。文章详细解释了`vector`的构造函数、赋值运算符、容量接口、迭代器接口、元素访问接口以及一些常用的增删操作函数。最后,还展示了如何使用`vector`创建字符串数组,体现了`vector`在实际编程中的灵活性和实用性。
683 4
|
11月前
|
存储 对象存储 C++
C++ 中 std::array<int, array_size> 与 std::vector<int> 的深入对比
本文深入对比了 C++ 标准库中的 `std::array` 和 `std::vector`,从内存管理、性能、功能特性、使用场景等方面详细分析了两者的差异。`std::array` 适合固定大小的数据和高性能需求,而 `std::vector` 则提供了动态调整大小的灵活性,适用于数据量不确定或需要频繁操作的场景。选择合适的容器可以提高代码的效率和可靠性。
|
11月前
|
存储 编译器 C语言
【c++丨STL】vector模拟实现
本文深入探讨了 `vector` 的底层实现原理,并尝试模拟实现其结构及常用接口。首先介绍了 `vector` 的底层是动态顺序表,使用三个迭代器(指针)来维护数组,分别为 `start`、`finish` 和 `end_of_storage`。接着详细讲解了如何实现 `vector` 的各种构造函数、析构函数、容量接口、迭代器接口、插入和删除操作等。最后提供了完整的模拟实现代码,帮助读者更好地理解和掌握 `vector` 的实现细节。
262 0
|
存储 C++ 索引
【C++打怪之路Lv9】-- vector
【C++打怪之路Lv9】-- vector
223 1
|
安全 测试技术 C++
【C++篇】从零实现 C++ Vector:深度剖析 STL 的核心机制与优化2
【C++篇】从零实现 C++ Vector:深度剖析 STL 的核心机制与优化
204 6
|
安全 测试技术 C++
【C++篇】从零实现 C++ Vector:深度剖析 STL 的核心机制与优化1
【C++篇】从零实现 C++ Vector:深度剖析 STL 的核心机制与优化
276 7

热门文章

最新文章

下一篇
oss云网关配置