• C++ vector


    标准库类型 vector 表示对象的集合,其中所有对象的类型都相同。集合中的每个对象都有一个与之对应的索引,所应用于访问对象。因为引用不是对象,所以不包含引用的 vector 。组成 vector 的元素可以是 vector 。

    vector 是一个类模板。vector 是模板而非类型,由 vector 生成的类型必须包含 vector 中元素的类型【vector<类型>】。

    头文件

    #include

    using std::vector;

    定义和初始化 vector 对象

    直接初始化的适用情况

    • 初始值已知且数量较少
    • 初始值是另一个vector对象的副本
    • 所有元素的初始值都一样

    两个 vector 对象的类型必须相同。

    列表初始化 vector 对象

    vector v = {a,b,c,...};

    特殊要求

    • 使用拷贝初始化时(即使用=时),只能提供一个初始值
    • 如果提供的是一个类内初始值,只能使用拷贝初始化或使用花括号的形式初始化
    • 如果提供的是初始元素值的列表,只能把初始值放在花括号里进行初始化,不能放在圆括号里

    指定数量的元素

    可用 vector 对象容纳的元素数量和所有元素的统一初始值初始化 vector 对象。

    vector v(n,val);

    值初始化

    可只提供 vector 对象容纳的元素数量而省略初始值,此时库创建一个值初始化的元素初值,并赋给容器中的所有元素,该初值由 vector 对象中元素的类型决定。

    若元素是内置类型,如int,元素初始值自动设为0;若元素是某种类类型,如string,则元素由默认初始化。

    vector ivec(10);// 10个元素,每个都初始化为0

    vector svec(10);// 10个元素,每个都是空 string 对象

    特殊要求

    • 有些类要求必须明确地提供初始值,如果vector对象中元素的类型不支持默认初始化,必须为其提供初始的元素值。对该类型来说,只提供元素的数量不设定初始值无法完成初始化工作。
    • 若只提供元素的数量没有设定初始值,只能使用直接初始化。

    列表初始值还是元素数量

    vector v1(10);// v1有10个元素,每个元素的值为0

    vector v2{10};// v2有1个元素,该元素值为10

    vector v3(10,1);// v3有10个元素,每个元素的值为1

    vector v4{10,1};// v4有2个元素,元素值分别为10和1

    使用圆括号,提供的值是用来构造vector对象的;使用花括号,可描述成列表初始化该vector对象,初始化过程会尽可能地把花括号内的值当成元素初始值的列表处理,只有无法执行列表初始化时才考虑其他初始化方式。

    若初始化时使用花括号的形式,但是提供的值不能使用列表初始化,会考虑用该值构造vector对象。列表初始化vector对象,花括号的值必须与元素类型相同。

    vector v5{"hi"};// 列表初始化:v5有一个元素

    vector v6("hi");// 错误,不能使用字符串字面值构建vector对象

    vector v7{10};// v7有10个默认初始化的元素

    vector v8{10,"hi"};// v8有10个值为"hi"的元素

    vector 操作

    向vector对象中添加元素

    创建一个空vector,在运行时再利用vector的成员函数 push_back 向其中添加元素。push_back 负责把一个值当成 vector 对象的伪元素“压到”vector 对象的“尾端”。若直到运行时才能知道vector对象中元素的确切个数,也可使用该方法。

    vector v;

    for(int i = 0; i != 100; ++i)

    v.push_back(i);

    string word;

    vector text;

    while(cin>>word){

    text.push_back(word);

    }

    vector 对象能高效增长,能在运行时快速地添加元素。虽然如此,但是如果不在定义 vector 对象时设定其大小,性能可能更差(当所有元素的值都一样时例外)。元素的值有所不同时,有效的方法是先定义一个空的 vector 对象,再在运行时向其中添加具体值。

    向 vector 对象添加元素蕴含的编程假定

    • 必须确保所写的循环正确无误,特别是在循环有可能改变 vector 对象容量的时候。
    • 若循环体内部包含有向 vector 对象添加元素的语句,不能使用范围 for 循环。

    size

    返回 vector 对象中元素的个数,返回值的类型是由 vector 定义的 size_type 类型。

    使用 size_type ,需首先指定其是哪种类型定义的,vector 对象的类型总是包含着元素的类型。

    vector::size_type

    关系运算符、相等运算符

    两个 vector 对象相等当且仅当它们所含的元素个数相同,而且对应位置的元素值也相同。

    关系元素符依照字典顺序进行比较:如果两个 vector 对象的容量不同,但是在相同位置上的元素值都一样,则元素较少的 vector 对象小于元素较多的 vector 对象;若元素的值有区别,则 vector 对象的大小关系由第一对相异的元素值的大小关系决定。只有当元素的值可能比较时,vector 对象才能被比较【Sales_item 类不支持相等性判断和关系运算等操作,不能比较两个 vector对象】。

    下标

    下标从 0 开始记,下标类型是相应的 size_type 类型。

    使用下标运算符可以获取到指定的元素。可通过计算得到 vector 内对象的索引,进而直接获取索引位置上的元素。

    只要 vector 对象不是一个常量,可以向下标运算符返回的元素赋值。

    不能使用下标形式添加元素。当有一个空的 vector 对象时,根本不包含任何元素,就不能通过下标去访问任何元素。

    下标运算符可用于访问已存在的元素,不能用于添加元素,且只能对确知已存在的元素执行下标操作。

  • 相关阅读:
    【云原生&微服务>SCG网关篇十一】Spring Cloud Gateway解决跨域问题
    数据结构与算法——选择排序法
    录屏软件介绍
    基于SpringBoot的校园失物招领系统
    STC8H开发(十六): GPIO驱动XL2400无线模块
    BSA-PEI,牛血清白蛋白-聚乙烯亚胺,BSA-聚乙烯亚胺的保存
    Java设计模式之亨元模式(Flyweight Pattern)
    golang开发 深入理解 context
    趁这个软件还没倒闭,我连夜用Python下载了所有壁纸...
    2022年湖北省中级工程师职称评审需要注意哪些问题呢?甘建二
  • 原文地址:https://blog.csdn.net/weixin_65951505/article/details/133942339