<02> 动态数组 & 迭代器
在 C++ 中,动态数组通常使用 std::vector 来实现。std::vector 是 C++ 标准库中的一个容器类,它能够动态地调整大小,并且提供了许多方便的操作函数。
1. 使用 std::vector 创建动态数组
#include <iostream>
#include <vector>
int main() {
// 创建一个空的 vector,可以存储 int 类型的元素
std::vector
// 向 vector 中添加元素
vec.push_back(10);
vec.push_back(20);
vec.push_back(30);
// 访问元素
std::cout << "第一个元素: " << vec[0] << std::endl;
std::cout << "第二个元素: " << vec[1] << std::endl;
std::cout << "第三个元素: " << vec[2] << std::endl;
// 获取 vector 的大小
std::cout << "vector 的大小: " << vec.size() << std::endl;
// 遍历 vector
for (int i = 0; i < vec.size(); ++i) {
std::cout << vec[i] << " ";
}
std::cout << std::endl;
// 使用范围-based for 循环遍历
for (int value : vec) {
std::cout << value << " ";
}
std::cout << std::endl;
return 0;
}
2. std::vector 的常用操作
添加元素:使用 push_back() 在末尾添加元素。
访问元素:使用 [] 或 at() 访问元素。at() 会进行边界检查,如果越界会抛出异常。
获取大小:使用 size() 获取当前元素的数量。
清空数组:使用 clear() 清空所有元素。
删除末尾元素:使用 pop_back() 删除最后一个元素。
插入元素:使用 insert() 在指定位置插入元素。
删除元素:使用 erase() 删除指定位置的元素。
3. 动态数组的内存管理
std::vector 会自动管理内存,当元素数量增加时,它会自动分配更多的内存;当元素数量减少时,它会释放多余的内存。你也可以手动调整 vector 的容量:
调整容量:使用 reserve() 提前分配足够的内存,以避免频繁的内存重新分配。
缩减容量:使用 shrink_to_fit() 将容量缩减到与当前元素数量相匹配。
4. 示例:动态数组的容量调整
#include <iostream>
#include <vector>
int main() {
std::vector
// 提前分配 100 个元素的内存
vec.reserve(100);
std::cout << "初始容量: " << vec.capacity() << std::endl;
for (int i = 0; i < 100; ++i) {
vec.push_back(i);
}
std::cout << "添加 100 个元素后的容量: " << vec.capacity() << std::endl;
// 缩减容量
vec.shrink_to_fit();
std::cout << "缩减容量后的容量: " << vec.capacity() << std::endl;
return 0;
}
5. 使用原始指针创建动态数组
虽然 std::vector 是推荐的方式,但在某些情况下,你可能需要使用原始指针来创建动态数组。这时可以使用 new 和 delete 来手动管理内存。
#include <iostream>
int main() {
// 创建一个动态数组
int size = 10;
int* arr = new int[size];
// 初始化数组
for (int i = 0; i < size; ++i) {
arr[i] = i * 10;
}
// 访问数组元素
for (int i = 0; i < size; ++i) {
std::cout << arr[i] << " ";
}
std::cout << std::endl;
// 释放内存
delete[] arr;
return 0;
}
6. 注意事项
使用原始指针创建动态数组时,务必记得使用 delete[] 来释放内存,否则会导致内存泄漏。
std::vector 是更安全、更易用的选择,推荐优先使用 std::vector。
总结
在 C++ 中,std::vector 是实现动态数组的首选方式,它提供了自动内存管理、丰富的操作函数和高度的灵活性。只有在特殊情况下,才需要考虑使用原始指针来手动管理动态数组。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)