std::vector 的基本用法

在 C++ 中,std::vector 是标准库提供的动态数组容器,支持自动扩容、随机访问,是最常用的容器之一。

一、基础用法

1.头文件与命名空间

#include <vector>
using namespace std; //或显示使用 std::vector
2.定义与初始化
// 定义空 vector
vector<int> vec1;                          // 存储 int 类型的空容器

// 初始化为 n 个值为 val 的元素
vector<int> vec2(5, 10);                   // 5 个元素,每个都是 10 → [10,10,10,10,10]

// 用初始化列表初始化(C++11+)
vector<int> vec3 = {1, 2, 3, 4};           // 直接初始化元素 → [1,2,3,4]

// 复制另一个 vector
vector<int> vec4(vec3);                    // 复制 vec3 的内容 → [1,2,3,4]
vector<int> vec5 = vec3;                   // 同上

二、常用成员函数

1.元素访问

函数 功能说明 示例
operator[] 访问索引 i 处的元素(无越界检查) vec[2] = 100;
at(i) 访问索引 i 处的元素(有越界检查,抛异常) int x = vec.at(2);
front() 返回第一个元素 int first = vec.front();
back() 返回最后一个元素 int last = vec.back();
data() 返回指向底层数组的指针(直接操作内存) int* ptr = vec.data();

2. 容量与大小

函数 功能说明 示例
size() 返回当前元素个数 int len = vec.size();
empty() 判断容器是否为空(size() == 0) if (vec.empty())
capacity() 返回当前可容纳的最大元素数(未扩容前) int cap = vec.capacity();
reserve(n) 预分配至少能容纳 n 个元素的内存(不改变 size) vec.reserve(100); // 预留空间
resize(n, val) 调整容器大小为 n,新增元素用 val 填充 vec.resize(5, 0); // 大小调整为 5

3. 元素修改

函数 功能说明 示例
push_back(val) 在尾部添加元素 vec.push_back(5);
pop_back() 删除尾部元素(不返回值) vec.pop_back();
insert(pos, val) 在迭代器 pos 位置插入 val vec.insert(vec.begin() + 2, 10);
erase(pos) 删除迭代器 pos 位置的元素 vec.erase(vec.begin() + 1);
erase(beg, end) 删除 [beg, end) 范围内的元素 vec.erase(vec.begin(), vec.begin()+2);
clear() 清空所有元素(size() 变为 0,capacity 不变) vec.clear();
swap(vec2) 与另一个 vector 交换内容(高效,常数时间) vec.swap(vec2);

4. 迭代器(遍历用)

函数 功能说明 示例
begin() 返回指向第一个元素的迭代器 for (auto it = vec.begin(); it != vec.end(); ++it)
end() 返回指向最后一个元素后一位的迭代器 同上(作为循环结束条件)
rbegin() 返回指向最后一个元素的反向迭代器 for (auto it = vec.rbegin(); it != vec.rend(); ++it)
rend() 返回指向第一个元素前一位的反向迭代器 同上(反向遍历)

三、遍历 vector 的几种方式

vector<int> vec = {1, 2, 3, 4, 5};

// 1. 下标遍历(适合随机访问)
for (int i = 0; i < vec.size(); ++i) {
    cout << vec[i] << " ";
}

// 2. 迭代器遍历(最通用,支持所有容器)
for (vector<int>::iterator it = vec.begin(); it != vec.end(); ++it) {
    cout << *it << " ";
}

// 3. 范围 for 循环(C++11+,简洁)
for (int x : vec) {
    cout << x << " ";
}

// 4. 反向遍历
for (vector<int>::reverse_iterator it = vec.rbegin(); it != vec.rend(); ++it) {
    cout << *it << " ";  // 输出:5 4 3 2 1
}

四、注意事项

1.动态扩容:当 size() == capacity() 时,push_back 会触发扩容(通常是翻倍分配新内存,复制旧元素,释放旧内存),效率较低。提前用 reserve(n) 预留空间可避免频繁扩容。

2.越界访问:operator[] 不检查越界,越界访问会导致未定义行为;at() 会检查越界并抛出 out_of_range 异常,更安全但略慢。

3.内存管理:vector 会自动释放内存,无需手动管理,但 clear() 不会释放已分配的内存(仅清空元素),若需释放内存可配合 swap:

vector<int>().swap(vec);  // 交换一个临时空 vector,触发内存释放

五、示例:综合使用

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

int main() {
    vector<int> vec;
    
    // 添加元素
    vec.push_back(10);
    vec.push_back(20);
    vec.push_back(30);
    
    // 插入元素
    vec.insert(vec.begin() + 1, 15);  // 在索引1处插入15 → [10,15,20,30]
    
    // 遍历输出
    cout << "元素: ";
    for (int x : vec) {
        cout << x << " ";  // 输出:10 15 20 30
    }
    
    // 修改元素
    vec[2] = 25;  // → [10,15,25,30]
    
    // 容量信息
    cout << "\nsize: " << vec.size()      // 4
         << ", capacity: " << vec.capacity() << endl;  // 通常为4或8(取决于实现)
    
    // 删除元素
    vec.erase(vec.end() - 1);  // 删除最后一个元素 → [10,15,25]
    
    return 0;
}
posted @ 2025-09-04 00:40  开心猪扒  阅读(25)  评论(0)    收藏  举报