【STL】------vector使用

一、概念

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                直接访问底层连续存储       

迭代器

begin
cbegin 返回指向起始的迭代器
end
cend 返回指向末尾的迭代器
rbegin
crbegin 返回指向起始的逆向迭代器
rend
crend 返回指向末尾的逆向迭代器

 容量

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的迭代器

迭代器:在容器器中遍历数据元素的解决方案就是使用迭代器

使用迭代器可以将容器的内部实现细节与用来访问容器的代码分隔开来。通过迭代器,容器可以被看做一个序列。迭代器允许遍历一个序列容器而无需考虑容器类型基本结构—— 即不管它是一个 vector 、一个 list 、一个 map,还是其他结构。因此迭代器的实现有容器的设计者实现。

六、增容

在程序运行过程中,最终会因为超出存储的范围而造成溢出,这时会有以下响应:

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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值