STL 之 vector

vector的基本用法:

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;
//转自:https://www.cnblogs.com/zhonghuasong/p/5975979.html
int main(int argc, char *argv[])
{
    /*
     * 1.声明向量
    */
    /*
    vector<int> vec;             //声明一个int型向量
    vector<int> vec(10);         //声明一个初始大小为10的int向量
    vector<int> temp(10, 1);     //声明一个初始大小为10且值都是1的向量
    vector<int> vec(temp);       //声明并用tmp向量初始化vec向量
    vector<int> v(vec.begin(), vec.begin() + 3);  //用向量vec的第0个到第2个值初始化v
    int arr[5] = {1, 2, 3, 4, 5};
    vector<int> vec(arr, arr + 5);      //将arr数组的元素用于初始化vec向量
    vector<int> v(&arr[1], &arr[4]); //将arr[1]~arr[4]范围内的元素作为v的初始值
    */
    /*
     * 2. 容量计算
    */
    /*
     * vec.size() : 向量大小
     * vec.capacity() : 向量真实大小
     * vec.empty() : 向量判空
     * vec.max_size() : 向量最大可以分配的容量
     * vec.resize() : 更改向量大小,可以更改为0,小于当前容量,大于当前容量
     * vec.shrink_to_fit() : 使vec的分配容量大小(即capacity())与size()相等
    */
    /*
     * 3. 修改
    */
    /*
     * vec.push_back() : 末尾添加元素
     * vec.pop_back() : 末尾删除元素
     * vec.swap() : 交换两个向量的所有元素
     * vec.clear() : 清空向量元素
     * vec.insert() : 任意位置插入元素,
     * 例如: vec.insert(vec.begin()+1,10),在下标1处插入元素10,下标从0开始
     * vec.erase() : 任意位置删除元素或删除一段区间的元素
     * 例如:vec.erase(vec.begin()+2),删除下标为2的元素,下标从0开始
     *      vec.erase(vec.begin()+2, vec.begin()+5),删除下标从2到5的位置的元素
     * vec.assign() : 多个元素赋值
     * 例如:v.assign(vec.begin(), vec.begin()+5),将vec的下标0-4的元素赋给向量v,
     * 类似于数组初始化的赋值,v.size()改为5
    */
    /*
     * 4.迭代器
    */
    /*
     * vec.begin(): 开始指针
     * vec.end() : 末尾指针
     * vec.cbegin() : 指向常量的开始指针
     * vec.cend() :指向常量的末尾指针
    */
    /*
     * 5.元素的访问
    */
    /*
     * vec[i] : 下标访问
     * vec.at(i) : 以上两者的区别就是at会检查是否越界,是则抛出out of range异常
     * vec.front() : 返回向量vec的第一个元素下标为0
     * vec.back() : 返回向量vec的最后一个元素下标为size()-1
     *
    */
    /*
     * 6.遍历元素
    */
    vector<int>vec(10, 2);
    vector<int>::iterator it;
    for(it = vec.begin(); it != vec.end(); ++it)
        cout<<*it<<endl;
    //当然也可以用下标访问
    /*
     * 元素翻转
    */
    vec.push_back(5);
    reverse(vec.begin(), vec.end());
    for(int i = 0; i < vec.size(); ++i)
        cout<<vec[i]<<" ";
    cout<<endl;
    /*
     * 元素排序
    */
    vec.push_back(1);
    vec.push_back(3);
    sort(vec.begin(), vec.end());
    for(int i = 0; i < vec.size(); ++i){
        cout<<vec.at(i)<<" ";
    }
    cout<<endl;
    return 0;
}

vector 的扩容机制

    为了支持快速随机访问,vector将元素连续存储—每一个元素紧挨着前一个元素存储。

vector的扩容机制涉及到的几个函数如下所示:

  1. size( ) : 容器已经保存的元素的个数;
  2. capacity( ) : 容器在不分配新的内存空间的前提下它最多可以保存多少元素;
  3. shrink_to_fit( ):将capacity( )减少为与size( )相同大小;
  4. reserve( n ): 分配至少能容纳n个元素的内存空间;

                                                            

                                                        图1 vector 内存分配示意图

    capacity() 的大小总是大于等于size()的大小,当capacity() = size()时,如果再添加一个元素,capacity()就会变为原来capacity()大小的两倍(这要看具体的标准库,这里以两倍进行讲解),这时候,容器将已有元素从旧位置移动到新空间,然后添加新元素,释放旧的存储空间。一旦vector空间重新配置,则指向原来vector的所有迭代器都失效了,因为vector的地址改变了,测试代码如下:

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    vector<int> vec;
    cout<<"size() = "<<vec.size()<<" capacity() = "<<vec.capacity()<<endl;
    for(int i = 0;i < 10 ; ++i){
        vec.push_back(i);
        cout<<"size() = "<<vec.size()<<" capacity() = "<<vec.capacity()<<endl;
    }
    return 0;
}

输出结果:

Reference :

  • C++ Primer

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Linux猿

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

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

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

打赏作者

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

抵扣说明:

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

余额充值