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、 所示
评论
更多评论