1. 成员函数:提供了vector容器的各类操作接口,涵盖元素访问、添加、删除、修改、容量管理等功能
  2. 非成员函数重载:通过重载与vector相关的运算符和函数,实现vector与其他数据类型或容器之间的交互,以及对vector进行便捷的通用操作
  3. 模板特化:针对特定类型对vector模板进行定制化处理,优化性能或满足特殊需求

在这里插入图片描述

在这里插入图片描述

1. 常见构造

在这里插入图片描述

在这里插入图片描述

构造函数声明

接口说明

vector(size_type n, const value_type& val = value_type())填充构造函数std::vector<int> v2(5, 10); std::vector<std::string> v3(3);

构造并初始化 n 个值为 val 的元素,创建一个包含 n 个指定值元素的 vector 对象。如果未指定 val,元素将使用默认构造函数初始化

vector(const vector& x)拷贝构造函数std::vector<int> v4(v2); std::vector<int> v5 = v2;

通过复制另一个 vector 对象 x 来创建新的 vector 对象,新对象与原对象内容完全相同

vector(InputIterator first, InputIterator last)迭代器范围构造函数int arr[] = {1,2,3}; std::vector<int> v6(arr, arr+3);

使用迭代器进行初始化构造,利用给定迭代器范围 [first, last) 内的元素来初始化 vector 对象

代码语言:javascript

AI代码解释

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

int main()
{
    // 1. 默认构造函数
    vector<int> first; 
    /* 说明:
    *    1. 创建一个空的int类型vector容器
    *    2. 此时容器中没有任何元素,size为0,capacity可能为0
    */

    // 2. 填充构造函数
    vector<int> second(4, 100);
    /* 说明:
    *    1. 创建一个包含4个元素的vector,每个元素初始值为100
    *    2. 构造后容器size为4,所有元素都是100
    */

    // 3. 迭代器范围构造函数 
    vector<int> third(second.begin(), second.end());
    /* 说明:
    *    1. 通过另一个容器的迭代器范围来构造
    *    2. 这里使用second容器的begin()和end()迭代器,构造一个与second元素相同的vector
    *    3. 本质是将second中的所有元素逐个拷贝到third中
    */

    // 4. 拷贝构造函数
    vector<int> fourth(third);
    /* 说明:
    *    1. 通过拷贝另一个vector来构造
    *    2. 这里直接拷贝third容器,构造出一个完全相同的新容器fourth
    */

    // 5. 数组构造:   
    int myints[] = { 16, 2, 77, 29 };   
    vector<int> fifth(myints, myints + sizeof(myints) / sizeof(int));
    /* 说明:通过数组的指针范围来构造vector
    *    1. 先定义一个int数组
    *    2. 计算数组元素个数:总字节数 / 单个元素字节数
    *    3. 然后使用数组的起始地址和结束地址(myints + 4)来构造fifth
    */

    // 使用迭代器遍历fifth容器并输出fifth容器中的内容
    cout << "fifth容器中的内容:";
   
    //1)vector<int>::iterator是vector<int>的迭代器类型,用于访问容器元素
    //2)begin()返回指向第一个元素的迭代器,end()返回指向最后一个元素后一位的迭代器
    for (vector<int>::iterator it = fifth.begin(); it != fifth.end(); ++it) 
    {
        //3)*it获取迭代器指向的元素值
        cout << ' ' << *it;
    }

    cout << '\n';
    return 0;
}

在这里插入图片描述

在这里插入图片描述

2. 容量操作

在这里插入图片描述

在这里插入图片描述

容量空间相关接口

接口说明

size

用于获取 vector 中实际存储的数据个数

capacity

用于获取 vector 当前已分配的容量大小即:能够容纳元素的最大数量

empty

用于判断 vector 是否为空若其中没有存储任何元素则返回 true,否则返回 false

resize

用于改变 vector 的大小(即:有效元素个数),可以增加或减少元素数量当增加元素时,可指定新元素的默认值当减少元素时,多余元素会被截断

reserve

用于改变 vector 的容量即:提前分配一定数量的存储空间,以避免在后续插入元素时频繁进行内存重新分配和数据拷贝操作

std::vector::size

在这里插入图片描述

在这里插入图片描述

代码语言:javascript

AI代码解释

// vector::size
#include <iostream>
#include <vector>
using namespace std; 

int main()
{
    //1. 创建一个空的 vector<int> 容器,用于存储 int 类型的数据
    vector<int> myints; 
    cout << "0. size: " << myints.size() << '\n';

    //2. 循环 10 次,每次向 myints 的末尾添加一个元素
    for (int i = 0; i < 10; i++)
    {
        myints.push_back(i);
    }
    cout << "1. size: " << myints.size() << '\n';

    //3. insert 成员函数用于在指定位置插入元素
    myints.insert(myints.end(), 10, 100);  //注意:这里是在 myints 的末尾(myints.end() 指向的位置)插入 10 个值为 100 的元素
    cout << "2. size: " << myints.size() << '\n';

    //4. pop_back 成员函数用于移除 vector 末尾的一个元素
    myints.pop_back();
    cout << "3. size: " << myints.size() << '\n';

    return 0;
}

在这里插入图片描述

在这里插入图片描述

std::vector::capacity

在这里插入图片描述

在这里插入图片描述

代码语言:javascript

AI代码解释

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

int main()
{
    //1.创建一个空的int类型vector容器
    vector<int> myvector;

    //2.向vector中添加100个元素(值从0到99)
    for (int i = 0; i < 100; i++)
    {
        myvector.push_back(i); // push_back()会在容器末尾插入元素,当容量不足时会自动扩容
    }
        

    //3.1:size():返回当前容器中实际存储的元素个数
    cout << "size: " << (int)myvector.size() << '\n'; //注:这里添加了100个元素,所以size为100

    //3.2:capacity():返回当前容器在不重新分配内存的情况下,最多能容纳的元素个数
    cout << "capacity: " << (int)myvector.capacity() << '\n';
    /* 说明:
    *    1. 由于vector的扩容策略(通常是翻倍增长),capacity会大于或等于size
    *    2. 此处添加100个元素后,capacity可能是128(取决于具体实现)
    */

    return 0;
}

在这里插入图片描述

在这里插入图片描述

std::vector::empty

在这里插入图片描述

在这里插入图片描述

代码语言:javascript

AI代码解释

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

int main()
{
    //1.创建一个空的int类型vector容器
    vector<int> myvector;
    //2.用于存储容器元素的总和
    int sum(0);

    //3.向vector中添加10个元素,值从1到10
    for (int i = 1; i <= 10; i++)
    {
        myvector.push_back(i);
    }

    //4.empty()方法用于判断容器是否为空,返回true表示空,false表示非空
    while (!myvector.empty()) //循环条件:当容器不为空时继续执行
    {
        //4.1:back()方法返回容器中最后一个元素的引用
        sum += myvector.back();

        //4.2:pop_back()方法移除容器中最后一个元素(不会返回元素值)
        myvector.pop_back();
    }

    //5.输出所有元素的总和
    cout << "total: " << sum << '\n';

    return 0;
}

在这里插入图片描述

在这里插入图片描述

std::vector::resize

在这里插入图片描述

在这里插入图片描述

代码语言:javascript

AI代码解释

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

int main()
{
    //1.创建一个存储int类型的vector容器
    vector<int> myvector;

    //2.向vector中添加初始元素:1到9
    for (int i = 1; i < 10; i++) 
    {
        myvector.push_back(i); 
    }

    //3.调整vector大小为5,超出部分的元素会被删除
    myvector.resize(5);

    //4.调整vector大小为8,新增的3个元素使用100填充
    myvector.resize(8, 100);

    //5.调整vector大小为12,新增的4个元素使用默认值0填充(int类型的默认值)
    myvector.resize(12);

    //6.输出vector中的所有元素
    cout << "myvector容器中内容为:";
    for (int i = 0; i < myvector.size(); i++) 
    {
        cout << ' ' << myvector[i];  
    }
    cout << '\n';  
    return 0;
}

在这里插入图片描述

在这里插入图片描述

std::vector::reserve

在这里插入图片描述

在这里插入图片描述

代码语言:javascript

AI代码解释

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

int main()
{
    //1.定义一个size_type类型的变量,用于存储容器的容量
    vector<int>::size_type sz;

    /*-------------------------情况一:未进行reserve()-------------------------*/
    cout << "-------未进行reserve()-------" << endl;

    //2.创建第一个vector容器foo
    vector<int> foo;
    //3.获取foo的初始容量(此时为空,容量通常为0)
    sz = foo.capacity();
    cout << "making foo grow:\n";

    //4.向foo中添加100个元素(0到99)
    for (int i = 0; i < 100; ++i) 
    {
        //4.1:向vector容器尾插入元素
        foo.push_back(i);

        //4.1:检容量是否发生变化 ---> 如果发生了变化
        if (sz != foo.capacity()) 
        {
            //4.2.1:更新容量值
            sz = foo.capacity();

            //4.2.2:输出新的容量
            cout << "capacity changed: " << sz << '\n';  
        }
    }
    /* 说明:
    *    1. foo没有预先分配空间,每次容量不足时会自动扩容
    *    2. 通常vector的扩容策略是翻倍增长(不同编译器可能有差异)
    */

    /*-------------------------情况二:进行reserve()-------------------------*/
    cout << "\n-------进行reserve()-------" << endl;

    //5.创建第二个vector容器bar
    vector<int> bar;
    //6.获取bar的初始容量
    sz = bar.capacity();
    cout << "making bar grow:\n";

    //7.预先为bar分配至少能容纳100个元素的空间
    bar.reserve(100);

    //8.向bar中添加100个元素(0到99)
    for (int i = 0; i < 100; ++i) 
    {
        //8.1:向vector容器尾插入元素
        bar.push_back(i);

        //8.1:检容量是否发生变化 ---> 如果发生了变化
        if (sz != bar.capacity()) 
        {
            //8.2.1:更新容量值
            sz = bar.capacity();  

            //8.2.2:输出新的容量
            cout << "capacity changed: " << sz << '\n';  
        }
    }
    /* 说明:
    *    1. bar预先分配了足够的空间,添加100个元素过程中不会发生容量变化
    */

    return 0;
}

在这里插入图片描述

在这里插入图片描述

3. 访问操作

在这里插入图片描述

在这里插入图片描述

访问相关接口

接口说明

operator []

重载的下标运算符,可像访问数组元素一样直接访问 vector 中的元素提供高效的随机访问方式

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐