基本概念:
vector容器功能与数组的功能类似!
提供了动态数组的功能,即大小可以自动调整的数组
使用vector容器需加头文件 #include<vector>
与普通数值的区别:
大小调整:
普通数组:大小固定,一旦声明就需要指定其大小,并且之后无法改变。
vector容器:动态数组,可以在运行时自动调整大小。当元素数量超过当前容量时,vector会自动分配更多的内存以容纳更多元素。自动分配是动态扩展!
动态扩展:不是在原空间之后续接新空间,而是找更大的内存空间,然后将原数据拷贝到新空间,释放原空间
内存管理:
普通数组:需要手动分配和释放数组所占用的内存,容易引发内存泄漏或越界错误。
vector容器:自动管理内存,包括分配、扩展和释放内存,减少负担,提高了代码的安全性。
初始化与构造:
普通数组:初始化时必须显式给出所有元素的值,或者默认初始化(例如,整型数组默认初始化为0)。
vector容器:提供多种构造方法,如默认构造、用特定数量的元素初始化、用区间内的元素初始化等。
接口丰富性:
普通数组:操作相对有限,主要依赖下标访问和指针算术。
vector容器:作为STL的一部分,提供了丰富的成员函数,如push_back, pop_back, insert, erase, size, empty等,便于元素的添加、删除和查询。
传递给函数:
普通数组:作为函数参数时,通常传递数组的指针(数组名),这使得难以确定数组的大小,且不能直接通过引用修改数组大小。
vector容器:可以按值传递、按引用传递或使用迭代器,更安全且功能更全面,尤其是当需要在函数内部修改容器时,传递引用避免了拷贝整个容器。
效率:
普通数组:由于其固定性和连续性,在已知大小且不需调整的情形下,访问速度可能更快,尤其是在循环遍历等场景。
vector容器:在某些情况下(如尾部插入和删除)由于连续内存布局可以非常高效,但当需要在中间插入或删除元素时,可能涉及元素的大规模移动。
使用(迭代器):
定义和初始化:
定义:
vector <T> vectorname ;
//实质是类模板
解释:
T 数据类型
vectorname 为vector容器名
举例子:
#include<iostream>
#include<vector>
int main()
{std::vector <int> v;return 0;
}
初始化:
通过举例子可以很清晰明了的看出
#include<iostream>
#include<vector>
int main()
{//列表初始化std::vector <int> v1{1,2,3,4} ;std::vector <int> v2 = {1,2,3,4};//指定大小(默认初始化为0)std::vector <int> v3(4);//指定大小初始化(指定v4有3个元素都为1)std::vector <int> v4(3, 1);//拷贝初始化std::vector <int> v5 (v4);std::vector <int> v6 { v4 };std::vector <int> v7 = v4;std::vector <int> v8(v1.rbegin(), v1.rend());//区间拷贝,从末尾到首的拷贝return 0;
}
控制元素操作:
添加元素
使用push_back(a)在末尾添加元素a
使用insert(a,b)在指定位置a插入b元素(a为迭代器)
使用insert(a,b,c)在指定位置a插入b个c元素(a为迭代器)
使用emplace(a,b)在指定位置a插入元素b(就地构造)(a为迭代器)
使用emplace_back(a)在末尾添加元素a(就地构造)
[就地构造]:是一种直接在最终存储位置创建对象的技术。这种技术可以避免额外的复制或移动操作,从而提高效率和资源利用率。
删除元素
使用pop_back()删除最后一个元素
使用erase(a)删除指定位置a的元素(a为迭代器)
使用erase(a,b)删除指定范围的元素(a与b为迭代器)
使用clear()删除所有元素
使用resize(int a)减少大小来删除元素
容器操作:
empty():
此函数用于判断容器是否为空。如果容器为空,则返回true,否则返回false。
size():
此函数返回容器中实际元素的数量,也就是容器的大小。
capacity():
此函数返回当前容器的容量,即在不重新分配内存的情况下,容器最多能容纳多少元素。这与当前元素的实际数量(size)可能不同。
resize(int num):
此函数用于重新指定容器的大小为num。
如果新的大小大于当前大小,容器会被填充默认值初始化的新元素直到达到num(对于内置类型如int,默认值通常是0)。
如果新的大小小于当前大小,容器尾部的元素会被移除,以减小容器的大小到num。
resize(int num, int elem):
这个是重载版本的resize同样用于调整容器大小到num,但当容器需要扩展时,新增的位置会使用指定的elem值进行填充,而不是默认值。
swap(n):
交换当前容器和容器n
数据存取:
[n]: 返回对容器中位置为 n 的元素的引用。(普通数组的访问数据方式在vector容器中也适用)
at(n): 返回对容器中位置为 n 的元素的引用,并进行边界检查。
front(): 返回对容器中第一个元素的引用。
back(): 返回对容器中最后一个元素的引用。