vector容器接口函数

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

构造函数声明 功能说明
vector() 无参构造函数 :创建一个空的 vectorsize() == 0
vector(size_type n, const value_type& val = value_type()) 填充构造函数 :构造包含 n 个元素的 vector,每个元素为 val 的拷贝;若未提供 val,则使用值初始化(如 int 初始化为 0)。
vector(const vector& x) 拷贝构造函数 :创建 x 的副本,新 vectorx 内容相同、独立存储。
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()

    • 返回指向 最后一个元素之后位置 的迭代器(不指向有效数据,仅作边界标记)。
    • 类型:iteratorconst_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_backpop_backresize 等操作改变。

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 及其后的所有元素向右移动一位,vectorsize() 增加 1。
  • 若当前容量不足,会触发重新分配内存(扩容),导致所有迭代器、指针和引用失效。
  • 返回指向新插入元素的迭代器。
  • 时间复杂度为 O(n),主要开销在于移动插入点之后的所有元素。

erase(pos)

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

swap(other)

  • vector 成员函数。
  • 功能:与另一个同类型的 vector 对象 other 交换全部内容(包括元素数据、大小 size() 和容量 capacity())。
  • 底层实现通常仅交换内部指针和控制成员(如指向数据的指针、sizecapacity),不复制或移动任何元素,因此非常高效。
  • 所有迭代器、引用和指针在交换后仍有效,但会指向对方容器中的对应位置(即"身份互换")。
  • 时间复杂度为 O(1)
相关推荐
寻寻觅觅☆6 小时前
东华OJ-基础题-106-大整数相加(C++)
开发语言·c++·算法
fpcc7 小时前
并行编程实战——CUDA编程的Parallel Task类型
c++·cuda
ceclar1238 小时前
C++使用format
开发语言·c++·算法
lanhuazui108 小时前
C++ 中什么时候用::(作用域解析运算符)
c++
charlee448 小时前
从零实现一个生产级 RAG 语义搜索系统:C++ + ONNX + FAISS 实战
c++·faiss·onnx·rag·语义搜索
老约家的可汗9 小时前
初识C++
开发语言·c++
crescent_悦9 小时前
C++:Product of Polynomials
开发语言·c++
小坏坏的大世界9 小时前
CMakeList.txt模板与 Visual Studio IDE 操作对比表
c++·visual studio
乐观勇敢坚强的老彭10 小时前
c++寒假营day03
java·开发语言·c++
愚者游世10 小时前
brace-or-equal initializers(花括号或等号初始化器)各版本异同
开发语言·c++·程序人生·面试·visual studio