1.特点
vector 常叫做动态数组 :
可以根据需要动态调整大小,不需要在创建时指定固定的大小
它内部使用动态分配的内存来存储元素,当需要添加或删除元素时,会自动进行内存管理
当然也可以手动
vector 可以进行随机访问 :
支持通过 下标(索引) 快速访问元素,即支持随机访问.通过下标访问元素的时间复杂度为O(1)
2.常用方法
一. 默认构建数组
std::vector <T> 数组名; // 构建了一个名为**数组名**的数组
二. 常用的初始化
①. 指定值初始化
std::vector<int> Vector(5, 10); // 创建一个包含5个10的数组
②. 使用数组初始化:
int arr[] = {1, 2, 3, 4, 5};
std::vector<int> Vector(arr, arr + sizeof(arr) / sizeof(int)); // 使用数组中的元素来初始化向量
③. 范围初始化:
直接使用中括号进行数组的初始化
④. 继承初始化:
std::vector<int> fatherVector = {1, 2, 3, 4, 5};
std::vector<int> sonVector(originalVector); // 使用另一个数组
的元素进行初始化
三. 大小的改变
常用大小的函数
-
size(): 返回数组中元素的个数
-
empty():检查数组是否为空,如果数组为空则返回true,否则返回false
-
resize():调整向量的大小,可以增加或减少数组的元素数量。
std::vector<int> Vector = {1, 2, 3};
Vector.resize(5); // 增加数组的大小为5,默认初始化新增的元素, 在vs中自动将没有元素的新增加空间赋值为0
Vector.resize(2); // 减少数组的大小为2,多余的元素会被删除
四. 元素的访问
-
vector支持随机访问元素,可以使用下标索引的方法, 常使用重载的中括号[ ]
-
或者使用 " * " 解引用迭代器,得到指定的元素
-
使用at()函数:类似于[]运算符,但提供了边界检查。如果索引超出范围,会抛出std::out_of_range异常 //更严谨的访问函数
-
使用 front() 和 back() 函数:但只能访问第一个元素和最后一个元素,并返回该元素
五. 插入与删除
在内存空间上,vector是连续的一段内存上存储数据,在增加元素时,会自动增加内存.
但是可能会遇到连续内存后的内存被占用的情况,所以会整体的迁移
①. push_back()
向容器末尾插入一个元素。该函数将元素添加到容器的末尾,并增加容器的大小
②. insert()
在指定位置插入一个或多个元素。该函数接受两个迭代器参数,第一个参数表示要插入的位置,第二个参数表示要插入的元素的范围
以下为代码示例
std::vector<int> Vector = {1, 2, 3};
auto it = Vector.begin() + 1; // 插入在第二个位置
Vector.insert(it, 4); // 在位置it处插入值为4的元素后 Vector 变为 {1, 4, 2, 3}
insert(position, count, value) :在指定位置插入 count 个值为 value 的元素
Vector.insert(it, 3, 4); // 在位置it处插入3个值为4的元素 Vector 变为 {1, 4, 4, 4, 4, 2, 3}
std::vector<int> aVector = {4, 5, 6};
Vector.insert ( it , aVector.begin() , aVector.end() ); // 在位置it处插入aVector的所有元素, Vector 变为 {1, 4, 5, 6, 4, 4, 4, 4, 2, 3}
③. pop_back()
删除容器末尾的元素。该函数将容器的大小减小一个单位。
④. erase()
删除指定位置或指定范围内的一个或多个元素.该函数接受一个迭代器参数,表示要删除的元素位置,或者两个迭代器参数,表示要删除的元素范围
注意 : erase() 的返回值
返回值为迭代器:
①. 单个元素删除:
语法 : erase(position)
如果删除的是单个元素,则返回指向被删除元素之后的元素的迭代器,如果删除的是最后一个元素,则返回容器的end()迭代器
②. 范围删除:
语法 : erase(first, last)
如果删除的是一个范围内的元素,则返回指向范围中第一个被删除元素之后的元素的迭代器,如果删除的范围是整个容器,则返回容器的end()迭代器
③. 无返回值: 如果使用erase()函数时没有使用返回值来接收,那么函数将不返回任何内容,只会删除指定的元素
六. 元素交换
语法:
swap(other):交换当前 vector 和另一个 vector 的内容。
3.vector中的迭代器的使用与注意点
容器中的迭代器是一个类中类
一. 构建迭代器的语法 : vector::iterator 迭代器名;
二. 迭代器常用的函数
begin():返回指向 vector 第一个元素的迭代器
end():返回指向 vector 最后一个元素之后位置的迭代器
三. 迭代器的操作符
Vector的迭代器支持一系列操作
例如: 解引用 ( * it ) 获取当前迭代器指向的元素,自增 (++it) 将迭代器移动到下一个位置,自减 (–it) 将迭代器移动到上一个位置,还可以使用关系运算符进行比较(it1 == it2,it1 != it2)
四. 使用迭代器删除元素
当Vector发生插入或删除操作时,迭代器可能会失效, 因此, 在插入或删除元素后,必须谨慎使用先前的迭代器
, 通常使用迭代器接收insert返回的新的迭代器