vector

vector容器相关

vector就是一个可以自动扩充的array,会动态调整所占用的内存空间,不需要人工干预,擅长在尾部插入或者删除元素,在常量时间就可以完成。

vector每当遇到空间不同的情况,都会按照当前最大空间的两倍空间进行空间申请。vector每次扩张都会视本身元素个数多少而造成元素的拷贝,以及元素的删除。如果申请不到两倍大的空间,生命就会自动结束。

在这里插入图片描述

自动增长的过程:调用了push_back()函数后判断是否达到最大容量(finish==end_of_storage)

①若没有达到,直接在尾部添加元素,如果达到最大元素,执行函数insert_aux(end(),x);
②执行后再进行判断是否达到最大容量(finish==end
_of_storage) 注:这里是为了防止insert_aux(end(),x)这个函数被单独调用,判断一下容量;
③如果没有达到,直接在尾部添加元素,如果达到了,判断当前vector容器是否为空容器,如果为空的,将其大小设置为1,不为空的话,扩充至原来的两倍。

扩充的步骤:
①调用分配器分配新的大小的容器的内存;
②将原vector内容拷贝到新内存中,并且为新的元素设定初值;
③拷贝插入点之后的内容 因为这个insert_aux(end(),x)函数可能被其他函数调用
④调用析构函数,删除原来容器分配的空间;
⑤调整旧的迭代器,指向新的位置

成员函数和array的没啥区别,多了一些函数

push_back()	在序列的尾部添加一个元素。
pop_back()	移出序列尾部的元素。
emplace()	在指定的位置直接生成一个元素。
emplace_back()	在序列尾部生成一个元素。

要注意

vector<int> values;//此时创建了一个空的vector容器,迭代器first和end是在一起的
int val = 1;
for (auto first = values.begin(); first < values.end(); ++first, val++) 
{
        *first = val;
        //初始化的同时输出值
        cout << *first;
}
//这样是不能赋值的,因为是first和end是在同一个位置,无法赋值
//对于空的容器来说,可以调用push_back()或借助resize()成员函数来实现初始化容器的目的

vector通过reserve()增加容量后,首个元素的位置发生了变化,因此每当容器的容量发生变化时,我们最好对之前创建的迭代器重新初始化,不然可能出现错误。

访问单个元素的方式:

①用[]直接访问

这种方法需要确保[]中的下标n不会超过容器的容量(可以通过capacity()成员函数获取),否则会发生越界的错误:就是检测不出来。[]重载出的访问元素的功能没有提供边界检查的功能,原因是性能:如果每次访问元素,都去检查索引值,会产生很大的开销,不存在越界边界检查时就没有这种开销了。

②at(index)

这种方法提供了越界检查,如果有错误,就会抛出std::out_of_range异常。

③两个成员函数:front(),back(),返回vector容器中第一个元素和最后一个元素的引用,通过这两个引用可以直接修改首尾元素

④data()函数

返回首个元素的指针,通过指针操作可以访问和修改容器中的元素。

#include <iostream>
#include <vector>
using namespace std;
int main()
{
    vector<int> values{1,2,3,4,5};
    //输出容器中第 3 个元素的值
    cout << *(values.data() + 2) << endl;
    //修改容器中第 2 个元素的值
    *(values.data() + 1) = 10;
    cout << *(values.data() + 1) << endl;
    return 0;
}
//输出迭代器所代表的值时记得加*
int main()
{
    vector<int> values{1,2,3,4,5};
    for (auto first = values.begin(); first < values.end(); ++first) {
        cout << *first << " ";
    }
    return 0;
}

emplace_back()和push_back()的区别

emplace_back() 和 push_back() 的区别,就在于底层实现的机制不同。push_back() 向容器尾部添加元素时,首先会创建这个元素,然后再将这个元素拷贝或者移动到容器中(如果是拷贝的话,事后会自行销毁先前创建的这个元素);而 emplace_back() 在实现时,则是直接在容器尾部创建这个元素,省去了拷贝或移动元素的过程。
emplace_back()比 push_back() 的效率高。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值