STL 之 vector

举报
Linux猿 发表于 2021/10/24 11:09:39 2021/10/24
【摘要】 🎈 作者:Linux猿 🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、面试、刷题、算法尽管咨询我,关注我,有问题私聊! 🎈 欢迎小伙伴们点赞👍、收藏⭐、留言💬

🎈 作者:Linux猿

🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、面试、刷题、算法尽管咨询我,关注我,有问题私聊!

🎈 欢迎小伙伴们点赞👍、收藏⭐、留言💬


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的扩容机制涉及到的几个函数如下所示:

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

ee.png

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

输出结果:

ff.png

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。