下面是使用 std::vector
实现的三种类型动态数组示例,相比原生指针,vector
更安全、更易用,且能自动管理内存:
1. int
类型动态数组(std::vector<int>
)
cpp
运行
#include <iostream>
#include <vector>
int main() {
// 初始化大小为5的vector,元素默认初始化为0
std::vector<int> intArray(5);
// 使用push_back动态添加元素(自动扩容)
intArray.push_back(100);
intArray.push_back(200);
// 使用下标访问元素
for (size_t i = 0; i < intArray.size(); i++) {
intArray[i] = i * 10;
}
// 使用范围for循环遍历元素
for (int num : intArray) {
std::cout << "Value: " << num << std::endl;
}
// 动态调整大小
intArray.resize(3); // 缩小到3个元素
intArray.resize(8); // 扩大到8个元素(新增元素默认初始化为0)
return 0; // 自动释放内存
}
2. double
类型动态数组(std::vector<double>
)
cpp
运行
#include <iostream>
#include <vector>
int main() {
// 直接初始化元素
std::vector<double> doubleArray = {1.1, 2.2, 3.3};
// 使用迭代器遍历元素
for (auto it = doubleArray.begin(); it != doubleArray.end(); ++it) {
*it *= 2.0; // 每个元素乘以2
}
// 动态添加元素
doubleArray.push_back(4.4);
doubleArray.push_back(5.5);
// 使用at()方法访问元素(带边界检查)
try {
std::cout << "Element at index 3: " << doubleArray.at(3) << std::endl;
std::cout << "Element at index 10: " << doubleArray.at(10) << std::endl; // 抛出out_of_range异常
} catch (const std::out_of_range& e) {
std::cerr << "Error: " << e.what() << std::endl;
}
return 0;
}
3. CString
类型动态数组(std::vector<CString>
)
cpp
运行
#include <afx.h> // MFC头文件
#include <vector>
#include <iostream>
int main() {
// 创建空的CString vector
std::vector<CString> stringArray;
// 添加元素
stringArray.push_back(_T("Hello"));
stringArray.push_back(_T("Vector"));
stringArray.push_back(_T("World"));
// 修改元素
stringArray[1] = _T("Dynamic");
// 使用范围for循环遍历(需转换为wcout可输出的格式)
for (const CString& str : stringArray) {
std::wcout << L"String: " << str.GetBuffer() << std::endl;
str.ReleaseBuffer(); // 使用GetBuffer()后需调用ReleaseBuffer()
}
// 插入元素到指定位置
stringArray.insert(stringArray.begin() + 1, _T("Inserted"));
// 删除最后一个元素
stringArray.pop_back();
return 0;
}
vector
核心优势
- 自动内存管理:无需手动
delete
,离开作用域时自动释放内存。 - 动态调整大小:
push_back()
:尾部添加元素,自动扩容。resize()
:调整容器大小。insert()
/erase()
:在指定位置插入 / 删除元素。
- 安全访问:
[]
:直接访问元素(无边界检查)。at()
:带边界检查的访问(越界时抛出异常)。
- 丰富的方法:
size()
、empty()
、clear()
等。
推荐用法
- 初始化:优先使用
std::vector<T> vec = {1, 2, 3};
直接初始化元素。 - 遍历:使用范围 for 循环(C++11+)或迭代器。
- 性能优化:若预先知道元素数量,使用
reserve()
预分配内存以减少扩容开销。cpp
运行
std::vector<int> vec; vec.reserve(100); // 预分配100个元素的空间