C++ vector 容器

C++ 中的 vector 是一种序列容器,它允许你在运行时动态地插入和删除元素。

vector 是基于数组的数据结构,但它可以自动管理内存,这意味着你不需要手动分配和释放内存。

与 C++ 数组相比,vector 具有更多的灵活性和功能,使其成为 C++ 中常用的数据结构之一。

vector 是 C++ 标准模板库(STL)的一部分,提供了灵活的接口和高效的操作。

基本特性:

  • 动态大小vector 的大小可以根据需要自动增长和缩小。
  • 连续存储vector 中的元素在内存中是连续存储的,这使得访问元素非常快速。
  • 可迭代vector 可以被迭代,你可以使用循环(如 for 循环)来访问它的元素。
  • 元素类型vector 可以存储任何类型的元素,包括内置类型、对象、指针等。

使用场景:

  • 当你需要一个可以动态增长和缩小的数组时。
  • 当你需要频繁地在序列的末尾添加或移除元素时。
  • 当你需要一个可以高效随机访问元素的容器时。

1. 头文件

#include <vector>

2. 声明和初始化

std::vector 可以通过多种方式声明和初始化。

2.1 默认初始化

std::vector<int> vec; // 创建一个空的 int 类型 vector

2.2 指定大小初始化

std::vector<int> vec(10); // 创建一个包含 10 个元素的 vector,每个元素初始化为 0

2.3 指定大小和初始值

std::vector<int> vec(10, 5); // 创建一个包含 10 个元素的 vector,每个元素初始化为 5

2.4 使用初始化列表

std::vector<int> vec = {1, 2, 3, 4, 5}; // 使用初始化列表创建 vector

2.5 拷贝初始化

std::vector<int> vec1 = {1, 2, 3};
std::vector<int> vec2(vec1); // 使用另一个 vector 初始化

3. 常用操作

3.1 访问元素

  • 使用 [] 或 at() 访问元素:

    std::vector<int> vec = {1, 2, 3, 4, 5};
    int first = vec[0];       // 访问第一个元素
    int second = vec.at(1);  // 访问第二个元素

  • [] 不会检查下标是否越界,访问越界时行为未定义。
  • at() 会检查下标是否越界,如果越界会抛出 std::out_of_range 异常。
  • 使用 front() 和 back() 访问首尾元素:

int first = vec.front(); // 访问第一个元素
int last = vec.back();   // 访问最后一个元素

3.2 添加元素

使用 push_back() 在末尾添加元素:

vec.push_back(6); // 在末尾添加元素 6

使用 emplace_back() 在末尾构造元素(避免不必要的拷贝):

vec.emplace_back(6); // 在末尾构造元素 6

使用 insert() 在指定位置插入元素:

vec.insert(vec.begin() + 2, 10); // 在第 3 个位置插入 10

3.3 删除元素

使用 pop_back() 删除末尾元素:

vec.pop_back(); // 删除最后一个元素

使用 erase() 删除指定位置的元素:

vec.erase(vec.begin() + 2); // 删除第 3 个元素

使用 clear() 清空所有元素:

vec.clear(); // 清空 vector

3.4 获取大小和容量

使用 size() 获取元素个数:

int size = vec.size(); // 获取元素个数

使用 capacity() 获取当前容量:

int cap = vec.capacity(); // 获取当前容量

使用 empty() 判断是否为空

if (vec.empty()) {
    std::cout << "Vector is empty!" << std::endl;
}

3.5 调整大小

使用 resize() 调整大小:

vec.resize(20); // 将 vector 大小调整为 20,多出的元素初始化为 0
vec.resize(20, 5); // 将 vector 大小调整为 20,多出的元素初始化为 5

使用 reserve() 预留空间(避免频繁扩容):

vec.reserve(100); // 预留 100 个元素的空间

3.6 遍历元素

使用下标遍历:

for (size_t i = 0; i < vec.size(); i++) {
    std::cout << vec[i] << " ";
}

使用迭代器遍历:

for (auto it = vec.begin(); it != vec.end(); it++) {
    std::cout << *it << " ";
}

使用范围 for 循环遍历:

for (int val : vec) {
    std::cout << val << " ";
}

4. 动态扩容

std::vector 在元素数量超过当前容量时会自动扩容,通常是当前容量的 2 倍。扩容会导致重新分配内存和元素拷贝,因此频繁扩容会影响性能。可以通过 reserve() 提前预留空间来避免频繁扩容。

5. 示例代码

以下是一个完整的示例代码,展示了 std::vector 的常见用法:

#include <iostream>
#include <vector>

int main() {
    // 初始化
    std::vector<int> vec = {1, 2, 3, 4, 5};

    // 添加元素
    vec.push_back(6);
    vec.emplace_back(7);

    // 访问元素
    std::cout << "First element: " << vec.front() << std::endl;
    std::cout << "Last element: " << vec.back() << std::endl;

    // 遍历元素
    std::cout << "Elements: ";
    for (int val : vec) {
        std::cout << val << " ";
    }
    std::cout << std::endl;

    // 删除元素
    vec.pop_back();
    vec.erase(vec.begin() + 2);

    // 调整大小
    vec.resize(10, 0);

    // 输出大小和容量
    std::cout << "Size: " << vec.size() << std::endl;
    std::cout << "Capacity: " << vec.capacity() << std::endl;

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值