Vector

vector 简介

vector 是C++标准模板库(STL)中最简单的一种容器

从概念上讲,vector 可以被认为是一个动态数组。这意味着它可以像普通数组那样通过索引进行随机访问,访问任何元素的时间复杂度是常数级别的

在实现方面,vector 的核心是使用一块连续的内存空间来存储元素,这与普通的数组完全一致。正是因为这种内存布局的连续性,才使得它能够支持快速的随机访问。

vector 最重要的特性之一是其动态性。与普通数组在创建时就需要固定大小不同,vector 的大小可以在程序运行过程中动态地改变。当您尝试向一个已经满的 vector 中插入新的元素时,vector 会自动进行以下操作:

  • 分配一块更大的内存块
  • 将原有的元素从旧的内存块拷贝到新的内存块中
  • 释放旧的内存块
  • 在新分配的内存块中插入新的元素

因此,vector 是一个灵活的数组,其大小可以动态地改变。您可以使用 push_back()vector 的末尾添加元素,如果需要,vector 会自动管理内存的分配和释放。您还可以使用 size() 获取当前 vector 中元素的数量,使用 capacity() 获取当前 vector 的容量(即在重新分配内存之前可以容纳的元素数量),并可以使用 reserve() 来预先分配一定的容量。

需要注意的是,由于 vector 在内存中是连续存储的,因此在任意位置(除了末尾)插入或删除元素可能涉及到元素的移动,这可能会影响性能。例如,在 vector 的头部插入元素 push_front() 不是一个高效的操作,因为它需要将所有现有元素都向后移动一位。如果您需要在序列的开头或中间频繁地进行插入和删除操作,那么 list(链表)可能是一个更合适的选择。

总而言之,vector 是一种使用连续内存实现的动态数组,它提供了快速的随机访问和自动的内存管理,是STL中最常用和最基础的容器之一。要使用 vector,您需要在代码中包含头文件 <vector>

vector 常用成员函数

成员函数 描述 来源
assign(iterator first, iterator last) 移除所有元素,并插入由迭代器 firstlast 指示范围内的元素。
assign(size_type n, const T& el = T()) 移除所有元素,并插入 nel 的副本。如果未提供 el,则使用 T() 进行默认构造。
at(size_type n) 返回位于位置 n 的元素。
back() 返回最后一个元素
begin() 返回一个指向第一个元素的迭代器。
capacity() 返回 vector 可以存储的元素数量(即在需要重新分配内存之前可以容纳的元素数量)。
clear() 移除所有元素
empty() 如果 vector 不包含任何元素则返回 true,否则返回 false
end() 返回一个指向 vector 最后一个元素之后的位置的迭代器。
front() 返回第一个元素
insert(iterator i, const T& el = T()) 在迭代器 i 所引用的元素之前插入 el,并返回一个指向新插入元素的迭代器。
insert(iterator i, size_type n, const T& el) 在迭代器 i 所引用的元素之前插入 nel 的副本。
insert(iterator i, iterator first, iterator last) 在迭代器 i 所引用的元素之前插入由迭代器 firstlast 指示范围内的元素。
max_size() 返回 vector 可以容纳的最大元素数量
operator[] 下标运算符,用于访问指定位置的元素。
pop_back() 移除最后一个元素
push_back(const T& el) vector末尾插入 el
rbegin() 返回一个指向最后一个元素的反向迭代器。
rend() 返回一个指向第一个元素之前的位置的反向迭代器。
reserve(size_type n) 预留足够的空间以容纳 n 个元素,如果当前的 capacity() 小于 n。这不会改变 size()
resize(size_type n, const T& el = T()) 改变 vector 的大小n。如果 n 大于当前 size(),则在末尾添加 n - size() 个值为 el 的元素;如果 n 小于当前 size(),则移除末尾的元素。
size() 返回 vector当前元素的数量
swap(vector<T>& v) 交换当前 vector 的内容与另一个 vector v 的内容。
vector() 构造一个空 vector
vector(size_type n, const T& el = T()) 构造一个包含 nel 副本的 vector。如果未提供 el,则使用 T() 进行默认构造。
vector(iterator first, iterator last) 构造一个包含由迭代器 firstlast 指示范围内元素的 vector
vector(const vector<T>& v) 拷贝构造函数,创建一个与 vector v 相同的副本。

vector 演示程序 (中文注释)

#include <iostream>
#include <vector>
#include <algorithm> // 包含 sort 等算法

using namespace std;

int main() {
    // 声明并初始化一个空的整型 vector
    vector<int> v1;
    cout << "v1 的初始大小: " << v1.size() << endl;
    cout << "v1 的初始容量: " << v1.capacity() << endl;

    // 使用 push_back 在末尾添加元素
    v1.push_back(10);
    v1.push_back(20);
    v1.push_back(30);
    cout << "在 v1 末尾添加元素后的大小: " << v1.size() << endl;
    cout << "在 v1 末尾添加元素后的容量: " << v1.capacity() << endl; // 容量可能会增加

    // 使用 at() 和下标运算符 [] 访问元素
    cout << "v1 的第一个元素 (使用 at()): " << v1.at(0) << endl;
    cout << "v1 的第二个元素 (使用 []): " << v1 << endl;

    // 使用 front() 和 back() 访问首尾元素
    cout << "v1 的第一个元素 (使用 front()): " << v1.front() << endl;
    cout << "v1 的最后一个元素 (使用 back()): " << v1.back() << endl;

    // 使用 begin() 和 end() 获取迭代器并遍历 vector
    cout << "v1 的元素: ";
    for (vector<int>::iterator it = v1.begin(); it != v1.end(); ++it) {
        cout << *it << " ";
    }
    cout << endl;

    // 使用 insert() 在指定位置插入元素
    v1.insert(v1.begin() + 1, 15); // 在第二个位置(索引为1)之前插入 15
    cout << "在 v1 中间插入元素后: ";
    for (int val : v1) { // 使用范围 for 循环遍历
        cout << val << " ";
    }
    cout << endl;

    // 使用 erase() 移除指定位置的元素
    v1.erase(v1.begin() + 2); // 移除第三个位置(索引为2)的元素
    cout << "从 v1 中移除一个元素后: ";
    for (int val : v1) {
        cout << val << " ";
    }
    cout << endl;

    // 使用 size() 获取当前大小
    cout << "v1 的当前大小: " << v1.size() << endl;

    // 使用 empty() 检查是否为空
    cout << "v1 是否为空? " << (v1.empty() ? "是" : "否") << endl;

    // 使用 clear() 移除所有元素
    v1.clear();
    cout << "清空 v1 后的大小: " << v1.size() << endl;
    cout << "v1 是否为空? " << (v1.empty() ? "是" : "否") << endl;

    // 演示带有初始大小和默认值的构造函数
    vector<int> v2(5, 0); // 创建一个包含 5 个 0 的 vector
    cout << "v2 的内容: ";
    for (int val : v2) {
        cout << val << " ";
    }
    cout << endl;

    // 演示使用迭代器范围构造 vector
    int arr[] = {1, 3, 5, 7, 9};
    vector<int> v3(arr, arr + sizeof(arr) / sizeof(int));
    cout << "v3 的内容: ";
    for (int val : v3) {
        cout << val << " ";
    }
    cout << endl;

    return 0;
}

这个程序演示了 vector 的一些基本操作,包括创建、添加元素、访问元素、插入和删除元素、获取大小和容量、以及清空 vector。您可以编译并运行这段代码以观察 vector 成员函数的行为。