c++ STL vector

记录下自己理解的vector,方便以后查阅,也方便被人查阅。
vector是容器,本质是模板,因为只要确定了要容纳的元素类型,此后这个容器就只容纳这些类型的元素,顺序容器,先加入的元素就在容器的前面,后加入的元素就在容器的后面,他们都是按照加入顺序紧密的排列在内存中。说白了它很像数组,只是vector可以动态增加容量(维度,原始数组一旦确定了维度就不能更改了)。

优点

1 因为是紧密的按照顺序排列的,所以通过下标索引元素的速度是很快的。
2 内部有相关策略,所以它不会因为元素的增加而时刻重新申请内存,一般申请的内存空间都比当前元素要占内存空间要多,内部自动管理内存,申请新内存后,把以前内存中的数据拷贝到新内存,然后释放旧内存(谁申请的内存,谁管理,如果容器中存的元素是指针,这些指针指向的内存它是不会管的,因为这些内存不是它申请的,这里说的内存是指因为要保存元素而申请的内存),即使是这样也比list这些链表式的容器插入元素的速度快。
3 在尾部插入或者删除速度是很快的。
4 内存集成了很多接口,方便操作

缺点

如果在vector中间某处新增或者删除元素,那就耗时了,我们可以想象一下,假设在中间删除一个元素,那么从删除元素后的所有元素都要向前移动,这样才紧密排列。一旦容器存的数据超多,那么移动的时间是会很多的。

用法举例

1 初始化
在这里插入图片描述
上图显示当元素个数size和capacity一样的时候,就重新申请了内存,此时capacity的容量为31,比当前元素个数size20多了10个。而且随着重新申请内存的次数增加(capacity-size)的值会越来越大。

vector<int> vec1;//此时vec1是空的,size和capacity都是0
vector<int> vec2(2, 1);//vec2有俩个元素,元素值都是1
int  array[3] = {1, 2, 3};
vector<int>  vec3(array, array+3);//此时vec3有三个元素,分别为1, 2, 3
vector<int> vec4(vec3);//此时vec4有三个元素,分别为1, 2, 3
vector<int> vec5(vec3.cbegin(), vec3.cend());//此时vec5有三个元素,分别为1, 2, 3
vec5.push_back(4);//此时vec5尾部多了一个元素
vec5.pop_back();//此时vec5尾部少了一个元素
vec5.clear();//此时vec5里面没有元素了,但是capacity还是有的
...........

访问元素

vector<int>  vec2 = {1, 2, 3, 5, 6, 7, 8, 9, 0, 12 , 13, 14, 15, 16};
//通过下标访问
vec2[2];//元素值为3
vec2.at(3);//元素值为3
//遍历
for (int i = 0; i < vec2.size(); i++)
{
    std::cout<<"element:"<<vec2[i]<<"   "<<vec2.at(i);
}
//STL  新增了迭代器,可以通过迭代器访问,迭代器有范围的概念,begin()指向首个元素,
//end()最后一个元素的下一个位置,意思就是end()处没有元素,它只是给你判断用的,是否遍历到尾部了。
//迭代器定义container<type>::iterator  ite_name;  迭代器用法有点像指针,*iterator 
// iterator->
vector<int>::iterator  iteBegin = vec2.begin();
for (; iteBegin != vec2.end(); iteBegin++)
{
    std::cout<<"element:"<< *iteBegin;
}
struct TestIte
{
    int a;
    int b;
};
vector<TestIte> vec6;
TestIte  varTmp;
varTmp.a = 0;
varTmp.b = 90;
vec6.push_back(varTmp);
 for (vector<TestIte>::iterator beg = vec6.begin(); beg != vec6.end(); beg++)
{
    std::cout << "element:" << (*beg).a<<" b:"<<(*beg).b<<"   a:"<<beg->a<<" b:"<<beg->b;
}

注意点

vector插入,删除元素的时候存在迭代器失效问题,,看下面

vector<int>  vec = {1, 2};
vector<int>::iterator  endIte = vec.end();
vec.push_back(3);
for (vector<int>::iterator beg; beg != endIte; beg++)
{
/
}
///上面代码是有问题的,endIte后面执行了插入元素,endIte已经失效了,不在指向以前的位置
//所以要更新endIte,
//如果我们想删除所有元素,应该如下
//存的元素是指针
for (int i = 0; i < vec.size(); i++)
{
    if( vec[i] != nullptr)
    {
        delete vec[i];
        vec[i] = nullptr;//千万不要vec.erase(i);
    }
}
vec.clear();
//如果存储的元素不是指针(对象或者智能指针)
vec.clear();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凯鲁吉亚不信

你的鼓励将是我最大的创作动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值