一、概念
1.vector的数据元素存储空间可以动态变化大小的序列容器
2.vector的数据元素使用连续的存储空间,可以使用常规指针,指向其元素,使用偏移量来访问存储空间中的数据元素
3.vector与数组不同,vector存储空间大小可以动态变化,容器会自动扩容存储空间
4.vector使用一个动态分配的连续存储空间来存储元素。在插入新元素时存储空间可能需要重新分配,以便增大存储空间,这意味着分配一个新存储空间要将所有的元素移动到其中。就处理时间而言,这是一项相对费时的任务。因此,vector不会在每次向容器添加元素时重新分配
5.vector容器可以分配一些额外的存储空间以适应可能增长,因此容器的实际容量可能大于严格需要的存储容量(即容器的大小)
6.vector与array相比,vector消耗更多的内存,以换取管理存储和以高效方式动态增长的能力
7.与其他动态序列容器(deque,list,forward_list)相比,vector可以非常高效的访问其元素(像数组一样),并高效地在数据元素地末尾添加或删除数据。对于在结尾以外的位置插入或删除元素的操作,其性能较差
二、vector对象存储模式
三、vector类型的成员函数
构造函数
(构造函数) 构造vector
(析构函数) 构造vector
operator= 将值赋给容器
assign 将值赋给容器
assign_range 将一个范围的值赋给容器(c++23)
get_allocator 返回关联的分配器
元素访问
at 带越界检查访问指定的元素
operator[] 访问指定的元素
front 访问第一个元素
back 访问最后一个元素
data 直接访问底层连续存储
迭代器
begincbegin 返回指向起始的迭代器endcend 返回指向末尾的迭代器rbegincrbegin 返回指向起始的逆向迭代器rendcrend 返回指向末尾的逆向迭代器
容量
empty 检查容器是否为空size 返回元素数max_size 返回可容纳的最大元素数reserve 预留存储空间capacity 返回当前存储空间能够容纳的元素数shrink_to_fit 通过释放未使用的内存减少内存的使用
修改器
clear 清除内容
insert 插入元素insert_range 插入一个元素范围 ( C ++ 23 )emplace 原位构造元素erase 擦除元素push_back 将元素添加到容器末尾emplace_back 在容器末尾原位构造元素append_range 添加元素的范围到末尾 ( C ++ 23 )pop_back 移除末元素resize 改变存储元素的个数swap 交换内容
四、创建vector对象
const int n = 10;
int ar[n] = { 12,23,34,45,46,67,78,89,90,100 };
std::vector<int> iveca; //空向量对象
std::vector<int> ivecb(5); //有5个int元素的向量对象,每个int元素的值为0
std::vector<int> ivecc(5,23); //有5个int元素的向量对象,每个int元素的值为23
std::vector<int> ivecd(ar,ar+n); //使用数组创建向量对象
std::vector<int> ivece(ivecd); //拷贝构造向量对象
std::vector<int> ivecf(std::move(ivecb)); //移动构造向量对象
std::vector<int> ivecg={1,2,3,4,5}; //使用列表创建
std::vector<int> ivech{1,2,3,4,5}; //使用列表创建
//vector嵌套实现:
const int n = 10;
// 定义一个大小为 n 的整型数组 ar,并进行初始化
int ar[n] = { 12,23,34,45,46,67,78,89,90,100 };
int veclen = 2;
// 创建一个二维的 std::vector arvec,它有 veclen 行
std::vector<std::vector<int> > arvec(veclen);
// 对 arvec 的第一行进行初始化,使用初始化列表
arvec[0] = { 1,2,3,4,5 };
// 对 arvec 的第二行进行初始化,使用数组 ar 的范围
arvec[1] = { ar, ar + n };
五、vector的迭代器
迭代器:在容器器中遍历数据元素的解决方案就是使用迭代器
六、增容
在程序运行过程中,最终会因为超出存储的范围而造成溢出,这时会有以下响应:
1.分配一块新的、更大的存储区域
2.将旧存储器的对象移动拷贝到新开辟的存储区(使用拷贝构造或移动构造)
3.销毁旧存储区的内存
4.释放旧存储区的内存
七、vector中reserve,resize,assign的区别
reserve:预分配存储器大小,即capacity的值,并没有进行初始化。并且reserve的值是推荐分配的内存大小,实际分配的可能等于或大于这个值。(vector只可以利用此内存,但是不可以访问)
resize:重新分配大小,改变容器的大小,并且创建对象。当n小于当前size()值时,vector首先会减少size()值保存前n个元素,然后将超出n的元素删除
assign:
将n个值为x的元素赋值到vector容器中,或者将区间【first,last】的元素赋值到当前的vector容器中,这个容器会清除掉vector容器以前的内容
void assign(size_type n,const T&x);
void assign(InputIt first,InputIt last);