#include <vector>应用

 在看这篇文章之前,先看看#include <vector>的简介。

 #include <vector>

这篇文章我来给大家几个vector的应用。

应用

应用1

#include <iostream>
#include <vector>
int main() {
    // 声明一个存储整数的 vector
    std::vector<int> numbers;
    // 添加元素
    numbers.push_back(10);
    numbers.push_back(20);
    numbers.push_back(30);
    // 输出 vector 中的元素
    std::cout << "Vector contains: ";
    for (int i = 0; i < numbers.size(); ++i) {
        std::cout << numbers[i] << " ";
    }
    std::cout << std::endl;
    // 添加更多元素
    numbers.push_back(40);
    numbers.push_back(50);
    // 再次输出 vector 中的元素
    std::cout << "After adding more elements, vector contains: ";
    for (int i = 0; i < numbers.size(); ++i) {
        std::cout << numbers[i] << " ";
    }
    std::cout << std::endl;
    // 访问特定元素
    std::cout << "The first element is: " << numbers[0] << std::endl;
    // 清空 vector
    numbers.clear();
    // 检查 vector 是否为空
    if (numbers.empty()) {
        std::cout << "The vector is now empty." << std::endl;
    }
    return 0;
}

应用二

#include <iostream>
#include <vector>

int main() {
    std::vector<int> vec = {1, 2, 3};
    try {
        std::cout << vec.at(2) << std::endl;  // 正常输出
        std::cout << vec.at(5) << std::endl;  // 超出范围,抛出异常
    } catch (const std::out_of_range& e) {
        std::cout << "Exception: " << e.what() << std::endl;
    }
    return 0;
}

应用三

#include <iostream>
#include <vector>
int main() {
    std::vector<int> vec;
    vec.push_back(10);
    vec.push_back(20);
    vec.push_back(30);
    std::cout << "Vector size: " << vec.size() << std::endl;
    std::cout << "Vector capacity: " << vec.capacity() << std::endl;
    // 删除最后一个元素
    vec.pop_back();
    std::cout << "After pop_back, size: " << vec.size() << std::endl;
    return 0;
}

 

<think>我们正在讨论C++中的<vector>头文件。用户之前询问了<algorithm>头文件,现在转向<vector>。根据用户提供的引用,他们提到了vector<vector<int>>作为二维数组的使用方法。用户现在想了解#include <vector>的作用和使用方法,因此我们需要详细解释<vector>头文件。 关键点: 1. <vector>头文件的作用:提供向量容器的实现,即动态数组。 2. 使用方法:包括如何声明、初始化、访问元素,以及常用操作(如添加、删除元素等)。 3. 注意事项:比如在C++11之前定义嵌套vector需要注意空格。 由于用户引用了二维数组的表示,我们也要涵盖vector<vector<int>>的使用。 按照要求: - 数学表达式使用$...$(行内)和$$...$$(独立) - 用中文回答 - 生成相关问题 结构建议: 一、<vector>头文件的作用 二、基本使用方法(一维向量) 三、二维向量(vector<vector<int>>) 四、常用成员函数 五、示例代码 六、注意事项 七、相关问题 注意:用户提供的引用[1]和[2]中关于vector<vector<int>>的内容,我们在回答中需要引用(在相关内容后添加[^1]或[^2]),但注意引用标识要自然地添加在段落末尾。 </think>### C++ `<vector>` 头文件详解 `#include <vector>` 是 C++ STL(标准模板库)的核心头文件,提供**动态数组容器**的实现。它解决了静态数组的固定大小限制,支持动态内存管理、高效元素访问和自动内存释放。 --- #### 一、核心功能与特性 1. **动态扩容机制** - **底层实现**:基于连续内存空间,初始分配固定容量(如 $n=8$) - **扩容策略**:当元素数量 $size$ 超过容量 $capacity$ 时,按 $capacity \times 2$ 重新分配内存(均摊时间复杂度 $O(1)$) - **扩容开销**:内存重分配 + 元素拷贝(需避免频繁插入) 2. **关键性能指标** | **操作** | **时间复杂度** | **说明** | |------------------|----------------|------------------------------| | 随机访问 `vec[i]` | $O(1)$ | 支持下标索引 | | 尾部插入 `push_back()` | $O(1)$ 均摊 | 最常用操作 | | 头部插入 `insert(begin())` | $O(n)$ | 需移动所有元素 | | 查找 `find()` | $O(n)$ | 需遍历或结合 `<algorithm>` | 3. **内存管理** - 自动释放内存(析构函数调用) - 手动优化:`shrink_to_fit()` 释放多余内存 - 预分配:`reserve(n)` 提前分配空间避免扩容开销 --- #### 二、基础用法示例 1. **一维向量** ```cpp #include <vector> int main() { // 声明与初始化 std::vector<int> nums = {3, 1, 4}; // C++11初始化列表 nums.reserve(100); // 预分配100元素空间 // 尾部添加元素 nums.push_back(1); // {3,1,4,1} // 随机访问 int x = nums[2]; // x=4 // 遍历(C++11范围for) for (int n : nums) { // 处理元素 } } ``` 2. **二维向量**(嵌套容器) ```cpp // 声明3×2矩阵 std::vector<std::vector<int>> matrix(3, std::vector<int>(2)); // 赋值与访问 matrix[0][0] = 5; // 首元素赋值 matrix[2].push_back(9); // 第三行添加元素 // 获取维度 int rows = matrix.size(); // 行数=3 int cols = matrix[0].size(); // 列数=2(假设每行等长)[^1][^2] ``` > **注**:C++11前需写为 `vector<vector<int> >`(`>>` 加空格避免歧义)[^1] --- #### 三、常用成员函数 | **函数** | **作用** | **示例** | |------------------------|----------------------------------|------------------------------| | `size()` | 返回元素数量 | `int n = nums.size();` | | `empty()` | 检查是否为空 | `if (nums.empty()) {...}` | | `push_back(T value)` | 尾部添加元素 | `nums.push_back(8);` | | `pop_back()` | 删除尾部元素 | `nums.pop_back();` | | `clear()` | 清空所有元素 | `matrix.clear();` | | `erase(iterator pos)` | 删除指定位置元素 | `nums.erase(nums.begin());` | --- #### 四、底层原理剖析 **内存布局**: ```plaintext +---------+---------+-----+---------+ | 元素0 | 元素1 | ... | 元素n-1 | +---------+---------+-----+---------+ ↑ ↑ ↑ begin() data() + i end() ``` - `data()`:返回指向底层数组的指针(C++11引入) - 迭代器失效:扩容后所有迭代器失效(需重新获取) **与静态数组对比**: ```cpp int arr[10]; // 静态数组(栈内存) std::vector<int> vec(10); // 动态数组(堆内存) ``` --- #### 五、典型应用场景 1. **替代原始指针数组** ```cpp // 安全的内存管理(无需手动delete) std::vector<MyClass> objList; objList.push_back(MyClass()); ``` 2. **动态数据存储** ```cpp // 读取未知数量数据 std::vector<double> sensorData; while (sensor.read()) { sensorData.push_back(sensor.value()); } ``` 3. **矩阵运算** ```cpp // 矩阵乘法 std::vector<std::vector<float>> matMul( const std::vector<std::vector<float>>& A, const std::vector<std::vector<float>>& B ) { // ... 实现矩阵乘法 } ``` --- ### 注意事项 1. **插入性能**:避免在首部插入,优先使用 `push_back` 2. **迭代器失效**:修改容器后需重新获取迭代器 3. **二维向量内存**:每行可独立扩容,但内存不连续(影响缓存效率) --- ### 相关问题 1. `vector` 与 `array`、`deque` 容器的性能差异如何量化? 2. 如何优化 `vector<vector<int>>` 的内存访问效率? 3. C++20 对 `vector` 引入了哪些新特性? 4. 在多线程环境下使用 `vector` 需要注意什么?[^1][^2]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值