vector容器接口函数

std::vector 构造函数接口说明

构造函数声明 功能说明
vector() 无参构造函数 :创建一个空的 vector,size() == 0。
vector(size_type n, const value_type& val = value_type()) 填充构造函数 :构造包含 n 个元素的 vector,每个元素为 val 的拷贝;若未提供 val,则使用值初始化(如 int 初始化为 0)。
vector(const vector& x) 拷贝构造函数 :创建 x 的副本,新 vector 与 x 内容相同、独立存储。
template <class InputIterator><br>vector(InputIterator first, InputIterator last) 范围构造函数 :用迭代器区间 [first, last) 中的元素构造 vector(左闭右开)。

代码演示

cpp 复制代码
#include <iostream>
#include <vector>

int main() {
    // 1. 无参构造
    std::vector<int> v1;
    std::cout << "v1.size() = " << v1.size() << "\n"; // 输出: 0

    // 2. 填充构造 (5 个 3)
    std::vector<int> v2(5, 3);
    for (int x : v2) std::cout << x << " "; // 输出: 3 3 3 3 3
    std::cout << "\n";

    // 3. 拷贝构造
    std::vector<int> v3(v2); // 或 std::vector<int> v3 = v2;
    std::cout << "v3.size() = " << v3.size() << "\n"; // 输出: 5

    // 4. 范围构造(从数组)
    int arr[] = {10, 20, 30};
    std::vector<int> v4(arr, arr + 3);
    for (int x : v4) std::cout << x << " "; // 输出: 10 20 30
    std::cout << "\n";

    return 0;
}

迭代器 begin() 与 end()

  • begin()

    • 返回指向 第一个元素 的迭代器。
    • 类型:iterator(非常量)或 const_iterator(常量容器或使用 cbegin())。
  • end()

    • 返回指向 最后一个元素之后位置 的迭代器(不指向有效数据,仅作边界标记)。
    • 类型:iterator 或 const_iterator。

用于正向遍历容器。

示例:

cpp 复制代码
std::vector<int> v = {10, 20, 30};
for (auto it = v.begin(); it != v.end(); ++it) {
    std::cout << *it << " "; // 输出:10 20 30
}

2. rbegin() 与 rend()

  • rbegin()

    返回一个 反向迭代器(reverse_iterator) ,指向容器中 最后一个元素。

  • rend()

    返回一个 反向迭代器(reverse_iterator) ,指向容器中 第一个元素之前的位置,作为反向遍历的结束标志(不可解引用)。

用于从后向前遍历容器。

注意:对反向迭代器执行 ++ 操作,逻辑上是向前移动(即向容器开头方向移动)。

示例:

cpp 复制代码
#include <iostream>
#include <vector>

int main() {
    std::vector<int> v = {1, 2, 3, 4, 5};

    // 反向遍历
    for (auto rit = v.rbegin(); rit != v.rend(); ++rit) {
        std::cout << *rit << " ";
    }
    // 输出:5 4 3 2 1

    return 0;
}

vector 容量与空间管理接口说明

1. 核心容量查询接口

接口 返回类型 功能说明
size() size_t 返回当前容器中 实际存储的元素个数。
capacity() size_t 返回当前已分配的 内存容量(最多可容纳元素数,无需重新分配)。
empty() bool 判断容器是否为空(等价于 size() == 0)。

2. 空间调整接口对比(重点)

操作 是否改变 size() 是否可能改变 capacity() 是否初始化新元素 主要用途
reserve(n) 否 是(仅当 n > capacity()) 否 预分配内存,避免频繁扩容
resize(n, val = T()) 是 是(若 n > capacity()) 是 调整有效元素数量,并用指定值(或默认值)初始化新增元素

3. 接口详解

size()

  • 表示 vector 中当前有多少个有效元素。
  • 可通过 push_back、pop_back、resize 等操作改变。

capacity()

  • 表示底层已分配的最大可容纳元素数量 ,不等于 size()。
  • 当 size() == capacity() 时,下一次插入会触发扩容(reallocate)。

empty()

  • 快速判断容器是否为空,等价于 size() == 0,但语义更清晰。

reserve(n)

  • 仅分配原始内存,不构造任何对象。
  • 不改变 size(),因此不能通过 operator[] 访问未初始化的位置。
  • 若 n <= capacity(),则无任何操作。
  • 常用于性能优化:提前预留空间,避免多次拷贝。

resize(n, val)

  • 调整 size() 到 n :
    • 若 n < size():销毁多余元素(调用析构函数)。
    • 若 n > size():在尾部追加 n - size() 个元素,使用 val(或默认构造)初始化。
  • 若所需空间超过当前 capacity(),会先扩容再初始化。

vector 增删查改接口说明

1. 核心操作接口速查表

操作 是否为 vector 成员函数 功能说明 时间复杂度
push_back(val)(重点) 是 在尾部插入一个元素 O(1)(均摊)
pop_back()(重点) 是 删除尾部最后一个元素 O(1)
operator[](pos) 是 通过下标随机访问元素 O(1)
insert(pos, val) 是 在迭代器 pos 位置前插入元素 O(n)
erase(pos) 是 删除迭代器 pos 位置的元素 O(n)
swap(other) 是 交换两个 vector 的内容(实际只是交换了他们的地址) O(1)
find(first, last, val) 否(属于 <algorithm>) 在 [first, last) 范围内查找值 O(n)

注意:find 不是 vector 的成员函数,而是 STL 算法库中的泛型算法。


push_back(const T& val) / push_back(T&& val)

  • 功能 :在 vector 尾部插入一个元素。

  • 特点 :

    • 若 size() == capacity(),会触发扩容(可能重新分配内存并拷贝/移动所有元素)。
    • 支持左值和右值引用(C++11 起)。
  • 示例 :

    cpp 复制代码
    std::vector<int> v;
    v.push_back(10); // v = {10}

pop_back()

  • 是 vector 成员函数。
  • 功能:删除 vector 尾部的最后一个元素。
  • 不返回被删除的元素(若需获取,应先用 back() 读取)。
  • 要求容器非空,否则行为未定义(可能导致程序崩溃)。
  • 时间复杂度为 O(1)。

operator[](pos)

  • 是 vector 成员函数。
  • 功能:通过下标 pos 直接访问 vector 中的元素,返回对应位置的引用(可读写)。
  • 不进行边界检查:若 pos 超出范围(pos >= size()),行为未定义(可能引发越界访问错误)。
  • 若需安全访问,应使用 .at(pos)(越界时抛出 std::out_of_range 异常)。
  • 时间复杂度为 O(1)。

insert(pos, val)

  • 是 vector 成员函数。
  • 功能:在迭代器 pos 所指向的位置之前 插入一个元素 val。
  • 插入后,原 pos 及其后的所有元素向右移动一位,vector 的 size() 增加 1。
  • 若当前容量不足,会触发重新分配内存(扩容),导致所有迭代器、指针和引用失效。
  • 返回指向新插入元素的迭代器。
  • 时间复杂度为 O(n),主要开销在于移动插入点之后的所有元素。

erase(pos)

  • 是 vector 成员函数。
  • 功能:删除迭代器 pos 所指向的单个元素。
  • 删除后,该位置之后的所有元素向前移动一位以填补空缺,vector 的 size() 减 1。
  • 返回指向被删除元素下一个位置 的迭代器(即原 pos + 1 处的新元素),可用于连续删除操作。 (重要)
  • 调用后,被删除位置及之后的迭代器、指针和引用均失效(若发生内存重分配,则所有迭代器都失效)。
  • 时间复杂度为 O(n),主要开销在于移动被删元素之后的所有元素。

swap(other)

  • 是 vector 成员函数。
  • 功能:与另一个同类型的 vector 对象 other 交换全部内容(包括元素数据、大小 size() 和容量 capacity())。
  • 底层实现通常仅交换内部指针和控制成员(如指向数据的指针、size、capacity),不复制或移动任何元素,因此非常高效。
  • 所有迭代器、引用和指针在交换后仍有效,但会指向对方容器中的对应位置(即"身份互换")。
  • 时间复杂度为 O(1)。
相关推荐
不会就选b6 小时前
C++补充部分(一)--lambda 表达式
开发语言·c++
丰色木夕13 小时前
Ubuntu22.04下源码编译安装USD-Brep
c++·ubuntu·nvidia·usd-brep
衍玊16 小时前
多路转接原理与应用
c++
himobrinehacken17 小时前
位运算揭秘:左右移与符号位陷阱
c语言·c++·算法·安全
Android小码家20 小时前
Vehicle 实战 自定义属性+测试demo
java·c++·framework·vhal·vehicle
hetao173383720 小时前
2026-10-19 hetao1733837 的刷题记录
c++·算法
夏虫不可与之言冰20 小时前
第三课 点亮 LED 与定时器非阻塞闪烁
c语言·c++·vscode·单片机·嵌入式硬件·物联网
辛苦才能20 小时前
C++ 哈希表深度解析:删除为什么必须打标记,负载因子为什么卡 0.7
开发语言·数据结构·c++·算法
miller-tsunami20 小时前
STL简介&string相关知识点
开发语言·c++·string
坤坤子吖21 小时前
Linux 线程同步与互斥——互斥锁
linux·服务器·c++·笔记·学习