c++中的vector

C++ 中的 `vector` 是一个非常常用的容器类,类似于动态数组。以下是一些关于 `vector` 的关键知识点和注意事项:

1. 基本概念

动态数组:`vector` 是基于数组实现的,能够动态调整大小。它存储相同类型的元素,并允许随机访问。

头文件:需要包含头文件 `<vector>`。

命名空间:位于 `std` 命名空间下,需要 `using namespace std;` 或直接使用 `std::vector`。

2. 定义与初始化

语法:

cpp 复制代码
vector<T> vec;         // 创建一个空的 vector,元素类型为 T
vector<int> nums;      // 创建一个空的 int 类型 vector

初始化方式:

默认构造:创建空的 `vector`。

初始化列表:`vector<int> vec = {1, 2, 3};`

拷贝构造:`vector<int> vec2(vec);`

预留空间:`vec.reserve(n);` 预留存储 n 个元素的内存,但元素数量仍为 0。

3. 常用成员函数

以下是一些常用的 `vector` 成员函数:

| 函数 | 描述 |

|--------------------|--------------------------|

| `push_back(val)` | 在末尾添加元素 |

| `pop_back()` | 删除末尾元素 |

| `size()` | 返回当前元素数量 |

| `capacity()` | 返回当前容量(可容纳元素的最大数量) |

| `empty()` | 判断是否为空 |

| `resize(n)` | 调整大小为 n |

| `clear()` | 删除所有元素 |

| `at(index)` | 访问索引为 index 的元素(支持边界检查) |

| `operator[]` | 访问索引为 index 的元素(不支持边界检查) |

| `begin()` | 返回指向起始位置的迭代器 |

| `end()` | 返回指向末尾位置的迭代器(超出范围) |

| `front()` | 返回第一个元素 |

| `back()` | 返回最后一个元素 |

4. 动态调整特性

`vector` 会在需要时自动调整大小,例如:

调用 `push_back` 添加元素时,如果当前容量不足,`vector` 会分配更大的内存。

注意事项:

动态调整可能导致性能开销,频繁调用 `push_back` 可能会增加内存分配次数。

可以通过 `reserve` 函数预先分配空间,减少调整次数。

5. 索引访问的注意事项

边界检查:

使用 `at(index)` 时,如果索引超出范围,会抛出 `out_of_range` 异常。

使用 `operator[]` 时,不会进行边界检查,可能导致未定义行为(如访问越界)。

6. 迭代器操作

迭代器失效:

如果对 `vector` 进行插入或删除操作(如 `push_back`, `pop_back`, `insert`, `erase`),可能会使所有现有的迭代器、指针和引用失效。

推荐使用范围 `for`:

cpp 复制代码
for (int x : vec) {
    cout << x << " ";
}

7. 清除与缩小容量

清除内容:

`vec.clear()` 删除所有元素,但不释放内存,容量(`capacity`)保持不变。

缩小容量:

调用 `shrink_to_fit()` 或手动重新分配内存,以释放多余空间。

8. 示例代码

以下是一个完整的代码示例,展示了 `vector` 的基本用法:

cpp 复制代码
#include <iostream>
#include <vector>

using namespace std;

int main() {
    vector<int> vec;

    // 添加元素
    vec.push_back(1);
    vec.push_back(2);
    vec.push_back(3);

    // 输出元素数量
    cout << "Size: " << vec.size() << endl;

    // 遍历并输出元素
    for (size_t i = 0; i < vec.size(); ++i) {
        cout << vec[i] << " ";
    }
    cout << endl;

    // 使用迭代器遍历
    for (auto it = vec.begin(); it != vec.end(); ++it) {
        cout << *it << " ";
    }
    cout << endl;

    // 清除元素
    vec.clear();
    cout << "Size after clear: " << vec.size() << endl;

    return 0;
}
cpp 复制代码
输出:

Size: 3
1 2 3
1 2 3
Size after clear: 0

9. 性能优化

预先分配空间:

如果知道元素的数量,可以使用 `reserve` 提前分配空间,减少内存分配次数:

cpp 复制代码
vec.reserve(100);  // 提前分配可存储 100 个元素的空间

避免频繁修改:

对于需要大量插入和删除操作的场景,`vector` 的性能可能不如 `list` 等容器。

10. 常见错误与陷阱

索引越界:

例如:`vec[10]` 访问了未初始化的内存(`vec` 的大小为 0),导致未定义行为。

迭代器失效:

修改 `vector` 的大小后,继续使用旧的迭代器会导致未定义行为。

容量和大小混淆:

capacity() 表示 `vector` 预分配的内存量(可能大于 `size()`)。

总结

`vector` 是 C++ 中非常强大且灵活的容器类,适用于大多数需要动态数组的场景。正确使用其成员函数、注意边界条件和动态调整特性,可以避免许多常见的编程错误,提高代码的效率和可维护性。

相关推荐
Uu_05kkq14 分钟前
【C语言5】函数:库函数、自定义函数、形参和实参、return语句、数组做函数参数、嵌套调用和链式访问、声明和定义
c语言·开发语言
小沈熬夜秃头中୧⍤⃝16 分钟前
fnOS生态下的WordPress个人网站从本地到公网访问的搭建与配置
java·开发语言
niu_sama24 分钟前
[杂学笔记] 封装、继承、多态,堆和栈的区别,堆和栈的区别 ,托管与非托管 ,c++的垃圾回收机制 , 实现一个单例模式 注意事项
c++·笔记·单例模式
21号 127 分钟前
*算法中的数据结构(3)
数据结构·算法·散列表
孑么1 小时前
力扣 最长回文子串
java·数据结构·算法·leetcode·职场和发展·动态规划
代码两三事1 小时前
快速搞定基础排序算法 —— 归并排序
数据结构·算法·排序算法
流光听风语1 小时前
【基础1】冒泡排序
java·数据结构·算法
小雅痞1 小时前
C语言--快速排序和归并排序
c语言·算法·排序算法
binbinxyz1 小时前
【算法系列】桶排序算法介绍及实现
java·算法·排序算法
挣扎与觉醒中的技术人1 小时前
如何本地部署大模型及性能优化指南(附避坑要点)
人工智能·opencv·算法·yolo·性能优化·audiolm