vector基础用法解析

std::vector 是 C++ STL (标准模板库) 中最基本也是最常用的一种容器。可以把它理解成一个功能强大的“智能数组”,它能自动管理内存。

本文旨在快速梳理std::vector 的基础用法。

  • 创建:通过多种方式灵活初始化。
  • 增删:熟练运用 push_back, pop_back, erase, clear
  • 访问:掌握 [], at(), front(), back() 的使用场景。
  • 遍历:优先使用基于范围的 for 循环。
  • 信息获取:理解 size()capacity() 的区别。

一、创建与初始化

这是使用 vector 的第一步。vector 的生命周期由作用域管理,当它离开作用域时,会自动销毁并释放内存,无需手动删除。

#include <vector> // 必须包含这个头文件
#include <string>
#include <iostream>

// 1. 创建一个空的 vector
std::vector<int> vec1; // 创建了一个可以存储 int 的空 vector

// 2. 创建时指定大小(所有元素会被初始化为默认值,比如 int 的 0)
std::vector<int> vec2(5); // 创建了一个包含 5 个 int 的 vector,所有元素都是 0

// 3. 创建时指定大小和初始值
std::vector<int> vec3(5, 100); // 创建了一个包含 5 个 int 的 vector,所有元素都是 100

// 4. 使用初始化列表(C++11 及以后最常用的方式)
std::vector<int> vec4 = {1, 2, 3, 4, 5};
std::vector<std::string> vec_str = {"hello", "world"};

// 5. 从另一个 vector 复制
std::vector<int> vec5 = vec4; // vec5 现在是 vec4 的一个完整拷贝

二、添加与删除元素

这是 vector 作为动态数组的魅力所在。

std::vector<int> v = {10, 20, 30};

// push_back(): 在末尾添加一个元素 (最常用!)
v.push_back(40); // v 现在是 {10, 20, 30, 40}

// pop_back(): 移除末尾的元素
v.pop_back(); // v 现在是 {10, 20, 30}

// insert(): 在指定位置插入元素
// v.begin() 是一个指向第一个元素的“迭代器”(可以看作一个智能指针)
// v.begin() + 1 就是指向第二个元素的位置
v.insert(v.begin() + 1, 99); // 在第二个位置插入 99,v 现在是 {10, 99, 20, 30}

// erase(): 删除指定位置的元素
v.erase(v.begin() + 2); // 删除第三个元素(20),v 现在是 {10, 99, 30}

// erase() 也可以删除一个范围内的元素
// 语法: v.erase(起始迭代器, 结束迭代器); (注意:区间是左闭右开)
// v.erase(v.begin(), v.begin() + 2); // 删除从第一个到第三个(不含)的元素,v会变成{30}

// clear(): 清空所有元素
v.clear(); // v 现在是空的 {}

三、访问元素

如何获取 vector 中存储的数据。

std::vector<int> v = {10, 20, 30, 40, 50};

// 方式一:operator[] (最常用,和普通数组一样)
int first_element = v[0]; // 10
int third_element = v[2]; // 30
// 警告:使用[]不进行边界检查,如果访问越界 (比如 v[10]),程序会出错(未定义行为)。

// 方式二:at() (更安全的方式)
int second_element = v.at(1); // 20
// v.at(10); // 如果越界,at() 会抛出一个异常,程序可以捕获并处理,比[]更安全。

// 方式三:front() (访问第一个元素)
int front_element = v.front(); // 10

// 方式四:back() (访问最后一个元素)
int back_element = v.back(); // 50

四、遍历元素

如何循环处理 vector 中的每一个元素。

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

// 方式一:基于范围的 for 循环 (C++11 及以后,最推荐的方式)
// 优点:简洁、安全、易读
for (int num : v) {
    std::cout << num << " ";
}
// 输出: 1 2 3 4 5

// 如果需要在循环中修改元素,使用引用 `&`
for (int &num : v) {
    num *= 2; // 将每个元素乘以 2
}
// v 现在是 {2, 4, 6, 8, 10}

// 方式二:传统的 for 循环(当需要使用索引时很方便)
for (size_t i = 0; i < v.size(); ++i) {
    std::cout << v[i] << " ";
}
// 输出: 2 4 6 8 10

// 方式三:使用迭代器
for (auto it = v.begin(); it != v.end(); ++it) {
    std::cout << *it << " "; // *it 用于获取迭代器指向的元素值
}
// 输出: 2 4 6 8 10

五、获取信息

检查 vector 的状态,比如它有多大,容量是多少等。

std::vector<int> v = {1, 2, 3};

// size(): 返回 vector 中元素的数量
std::cout << "Size: " << v.size() << std::endl; // 输出: Size: 3

// empty(): 检查 vector 是否为空,返回 bool 值
if (v.empty()) {
    std::cout << "Vector is empty." << std::endl;
} else {
    std::cout << "Vector is not empty." << std::endl; // 会执行这句
}

// capacity(): 返回在不重新分配内存的情况下,vector 可以容纳的元素数量
// capacity 通常大于或等于 size,这是 vector 为了效率预留的空间
std::cout << "Capacity: " << v.capacity() << std::endl; // 输出可能是 3 或更大

// reserve(): 预留存储空间
// 如果你事先知道要存大量元素,先 reserve 可以避免多次内存重新分配,提高效率
v.reserve(100);
std::cout << "New Capacity: " << v.capacity() << std::endl; // 输出: New Capacity: 100

// resize(): 强制改变 vector 的大小
v.resize(5); // 将大小改为5,多出的元素用默认值0填充。v 现在是 {1, 2, 3, 0, 0}
v.resize(2); // 将大小改为2,多出的元素被丢弃。v 现在是 {1, 2}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值