中关村在线

软件

C++ vector容器详解

vector是C++标准模板库中的动态数组容器。

1、 Vector采用动态数组存储数据。

2、 vector扩容时,容量会以当前大小的两倍进行增长。

3、 vector会分配连续的内存区域,扩容时不会在原空间上直接扩展,而是申请更大的新内存空间,将原有元素逐一复制到新位置,随后释放旧内存。

4、 操作容器时应立即更新迭代器,因原指向旧内存的迭代器已失效。

5、 vector是连续存储的线性数据结构。

6、 通过三个迭代器分别指向线性空间的不同区域范围进行操作。

7、 声明迭代器变量

8、 {

9、 ...

10、 };

11、 其中,

12、 首个指针指向存储区域的起始位置

13、 指向已使用空间末尾位置的指针

14、 End:指向内存容量末尾位置的指针

15、 示例一:一减一

16、 ...

17、 vector初始化时分配6个内存空间,用于存储data的6个元素。

18、 当插入第7个元素6时,vector会通过扩容机制自动重新分配内存空间。

19、 数据存储结构所示

20、 分析:

21、 当插入第七个元素时,vector原有容量不足,自动申请容量为12的新内存空间,将原数据复制至新空间前部,随后在末尾插入第七个元素。

22、 此时_Last指向序列中最后一个有效元素的位置。

23、 _End迭代器指向vector最后一个有效元素的下一位置。

24、 通过调用vector的size成员函数可获取其当前大小,结果为7。

25、 通过调用capacity成员函数,可获取vector当前容量,其值为12。

26、 vector构造函数的原型定义

27、 默认构造函数,创建一个空的vector对象。

28、 创建一个包含n个元素的vector对象,每个元素的值均为v,若未指定v则使用T类型的默认值。该构造函数显式声明,防止隐式类型转换。

29、 vector中所有存储的对象均已初始化。

30、 若未指定存储对象的初始值,内置类型将默认初始化为0。

31、 类类型将通过调用默认构造函数完成初始化。

32、 若无默认构造函数,必须显式提供元素的初始值。

33、 示例:

34、 创建一个空的容器v1,用于存储字符串类型的数据。

35、 创建一个包含10个字符串对象的容器,每个字符串均具有初始值(空字符串)。

36、 创建一个包含5个字符串元素的容器,每个元素的初始值均为hello。

37、 创建一个名为v4的字符串向量,其内容从v3的起始位置复制到结束位置,从而实现v3的完整副本。

38、 vector的成员函数包括添加、删除、访问等操作。

39、 判断容器是否为空,若空则返回真,否则返回假。

40、 返回容器所能容纳元素的最大数量,该值由容器类型决定,通常在初始化后保持不变。

41、 返回容器内当前存储的元素数量。

42、 返回容器当前可容纳的元素数量,表示存储空间的上限。

43、 容量不小于当前大小,满足条件。

44、 预留至少n个元素的存储空间,若当前容量小于n则重新分配内存,保证后续插入时无需频繁扩容,提升容器性能。

45、 调整容器大小至n,若原尺寸小于n,则以元素x的值填充新增部分;否则截断多余元素。调用后保证容器大小等于n,其中x为可选参数,默认为T类型的默认值。

46、 返回容器内首个元素的引用,要求容器不能为空。

47、 返回容器中最后一个元素的引用,要求容器不能为空。

48、 返回指定位置元素的引用,位置索引从0开始。若提供的索引超出有效范围,则行为未定义。此操作不进行边界检查,调用时需确保索引合法。

49、 返回指定位置pos处元素的引用,若pos超出容器有效范围,则抛出out_of_range异常。该操作会进行边界检查,确保访问安全。

50、 返回指定位置pos处的元素引用,若位置超出范围则抛出异常,用于常量对象的安全访问。

51、 在容器的末尾添加一个指定元素,传入的参数为待添加元素的常量引用。

52、 移除容器末尾的元素,调用前需确保容器不为空。

53、 插入与删除操作会引起元素位置变动,可能导致之前获取的迭代器失效,请谨慎使用。

54、 在指定位置之前插入元素,返回指向新插入元素的迭代器。若未指定元素值,则插入默认构造的对象。该操作将原位置及之后的元素依次后移。

55、 在指定位置插入 n 个元素 x,插入后原迭代器可能失效,请谨慎使用。

56、 删除指定位置的元素,随后返回被删元素下一个位置的迭代器;若之后无元素,则返回指向末尾的迭代器。

57、 删除指定范围内的元素后,被删除位置之后的所有元素对应的迭代器将失效,需谨慎使用,避免后续操作中访问无效迭代器导致未定义行为。

58、 清空容器内容,功能等同于调用 erase( begin(), end() ),将所有元素移除。

59、 将容器中的所有元素替换为由指定数量和值组成的序列,即用 n 个相同元素 x 来重新填充整个容器内容。

60、 返回指向序列起始位置的常量迭代器,用于遍历容器中的元素。

61、 调整容器大小可能导致原有迭代器失效。

62、 比较两个vector对象是否相等的非成员函数操作

63、 六种比较运算符

64、 其中,

65、 当两个vector对象的元素数量相同,且对应位置的元素值均相等时,它们被视为相等;反之则不相等。这一规则适用于判断vector对象是否相等或不等的操作。

66、 使用字典序规则对 operator<、operator<=、operator> 和 operator>= 进行比较判断。

67、 vector常用操作详解

68、 包含vector相关功能的头文件

69、 使用标准命名空间,这是编程中必不可少的步骤。

70、 创建vector对象的方法

71、 声明一个int类型的一维动态数组vec。

72、 用于存储三维点坐标的二维数组结构,外层为向量容器,内层存储具体点数据,形成多层次的点集集合。

73、 尾部添加数字

74、 通过下标访问vector元素,下标值从零起始。

75、 {

76、 }

77、 遍历容器中的容器,即处理二维数组结构。

78、 遍历大容器中的每个元素,从索引0开始,逐个处理mVecPoint中的所有点数据。

79、 {

80、 遍历小容器中的每个元素,依次处理 mVecPoint 的所有数据项。

81、 {

82、 }

83、 }

84、 创建一个二维动态数组

85、 {

86、 {

87、 }

88、 }

89、 {

90、 {

91、 }

92、 }

93、 通过迭代器遍历访问元素

94、 添加元素

95、 在向量的第 i 个位置前插入元素 a,a 将成为新的第 i+1 个元素,原位置及之后的元素依次后移一位。

96、 移除指定元素

97、 删除容器中索引为2的元素,即移除第三个位置上的数据内容。

98、 vector中的元素可为任意数据类型。

99、 包括二维浮点坐标点、双精度坐标点、动态数组及自定义结构体等数据类型。

100、 容器存储自定义数据类型

101、 定义一个自定义类

102、 {

103、 };

104、 创建一个用于存储类的容器。

105、 vector存储结构体常用两种方式:直接存储对象或存储对象指针。

106、 方法一:传递结构体变量的副本。

107、 方法二:传入指向结构体变量的指针。

108、 设结构体类型变量如下所示

109、 {

110、 性别(字符型变量)

111、 示例:

112、 所示

113、 向量排序:对元素进行升序排列

114、 当vector中存储基本数据类型时,可使用std::sort()函数实现升序或降序排列。

115、 将容器 vi 中的元素按升序排列,默认从小到大排序。

116、 将向量vi中的元素顺序反转,实现从大到小的排列。

117、 从大到小排序比较

118、 设定排序比较规则

119、 {

120、 }

121、 调用sort(vec.begin(), vec.end(), Comp)即可实现降序排列。

122、 当vector中存储自定义结构体时,如何实现升序和降序排序?

123、 两种方式可选

124、 调整结构体或类的定义,重写排序函数逻辑以实现自定义排序功能。

125、 在类或结构体外部定义函数,通过sort调用该函数实现排序功能。

126、 所示

展开全文
人赞过该文
内容纠错

相关电商优惠

评论

更多评论
还没有人评论~ 快来抢沙发吧~

读过此文的还读过

点击加载更多

内容相关产品

说点什么吧~ 0

发评论,赚金豆

收藏 0 分享
首页查报价问答论坛下载手机笔记本游戏硬件数码影音家用电器办公打印 更多

更多频道

频道导航
辅助工具