std::vector是动态数组,支持自动内存管理、随机访问和动态扩容,相比C数组更安全高效。1. 可通过声明初始化创建;2. 用push_back或emplace_back添加元素,后者原地构造更高效;3. 支持下标、at()和迭代器访问,at()具备边界检查;4. 提供pop_back、erase和clear删除元素;5. size表示元素数量,capacity为已分配内存容量,可用reserve预分配、shrink_to_fit释放多余空间。emplace_back适用于直接构造对象,push_back适合已有对象;合理使用reserve可减少内存重分配开销,避免迭代器失效问题。

C++中,STL的
std::vector
使用
std::vector
1. 声明与初始化:
你可以直接声明一个空的
vector
立即学习“C++免费学习笔记(深入)”;
std::vector<int> myNumbers; // 存储整数的vector std::vector<std::string> names; // 存储字符串的vector
或者在声明时进行初始化:
std::vector<int> initialNumbers = {10, 20, 30, 40}; // 使用初始化列表
std::vector<double> fixedSizeVector(5); // 创建一个包含5个double类型元素,默认值为0.0的vector
std::vector<char> filledVector(3, 'A'); // 创建一个包含3个'A'的vector2. 添加元素:
最常用的方式是
push_back()
vector
myNumbers.push_back(50); // myNumbers现在是 {10, 20, 30, 40, 50}
myNumbers.push_back(60); // myNumbers现在是 {10, 20, 30, 40, 50, 60}对于自定义对象,
emplace_back()
vector
struct Point {
int x, y;
Point(int _x, int _y) : x(_x), y(_y) {}
};
std::vector<Point> points;
points.emplace_back(1, 2); // 直接构造Point(1, 2)
points.push_back(Point(3, 4)); // 先构造Point(3, 4),再拷贝或移动到vector3. 访问元素:
你可以像访问数组一样使用
[]
at()
int firstNum = myNumbers[0]; // 访问第一个元素,不进行边界检查 int lastNum = myNumbers.back(); // 访问最后一个元素 int safeNum = myNumbers.at(1); // 访问第二个元素,会进行边界检查,越界会抛出std::out_of_range异常
迭代器也是访问元素的强大工具:
for (int num : myNumbers) { // C++11 范围for循环
std::cout << num << " ";
}
std::cout << std::endl;
for (auto it = myNumbers.begin(); it != myNumbers.end(); ++it) { // 传统迭代器循环
std::cout << *it << " ";
}
std::cout << std::endl;4. 删除元素:
pop_back()
myNumbers.pop_back(); // 删除了60
erase()
myNumbers.erase(myNumbers.begin() + 1); // 删除第二个元素 (20) myNumbers.erase(myNumbers.begin(), myNumbers.begin() + 2); // 删除前两个元素
clear()
myNumbers.clear(); // vector变为空
5. 大小与容量:
size()
vector
capacity()
vector
reserve(n)
n
shrink_to_fit()
vector
std::vector<int> data;
data.reserve(100); // 预留100个元素的空间
for (int i = 0; i < 50; ++i) {
data.push_back(i);
}
std::cout << "Size: " << data.size() << ", Capacity: " << data.capacity() << std::endl;
data.shrink_to_fit(); // 尝试将容量调整到50
std::cout << "After shrink_to_fit, Size: " << data.size() << ", Capacity: " << data.capacity() << std::endl;std::vector
vector
在我看来,
std::vector
int arr[10];
int* arr = new int[10];
delete[]
std::vector
vector
push_back
vector
vector
vector
at()
at()
std::out_of_range
[]
vector
size()
empty()
clear()
insert()
erase()
std::sort
std::std::find
vector
vector
我个人觉得,除非在极度追求极致性能且内存分配模式非常固定、或是在与C语言库接口时,否则几乎所有情况下都应该优先选择
std::vector
push_back
emplace_back
这俩兄弟都是往
vector
vector
push_back
push_back
std::move
vector
emplace_back
emplace_back
vector
性能差异:
int
double
push_back
emplace_back
emplace_back
使用场景:
使用 push_back
vector
MyObject obj("data");
myVector.push_back(obj); // 拷贝
myVector.push_back(std::move(obj)); // 移动vector
push_back
myVector.push_back(MyObject("temp_data")); // 移动使用 emplace_back
vector
emplace_back
vector
// 假设MyObject有一个构造函数MyObject(const std::string& name, int id)
myVector.emplace_back("new_item", 123); // 直接在vector内部构造MyObjectemplace_back
总的来说,我的建议是:如果能用 emplace_back
vector
emplace_back
push_back
push_back
emplace_back
std::vector
std::vector
核心机制:内存重新分配 (Reallocation)
当
vector
这个过程,尤其是当元素数量很多时,开销是相当大的。频繁的重新分配会导致性能下降,因为涉及到内存申请、数据移动和内存释放。
容量 (Capacity) 与 大小 (Size) 的理解:
这两个概念是
vector
vector
vector::size()
push_back
size()
vector
vector::capacity()
size()
size()
capacity()
举个例子:
std::vector<int> v; // size = 0, capacity = 0 (或某个很小的初始值) v.push_back(1); // size = 1, capacity 可能变为 1 v.push_back(2); // size = 2, capacity 可能变为 2 (如果之前是1) 或 4 (如果之前是2,增长2倍) v.push_back(3); // size = 3, capacity 可能保持 4 v.push_back(4); // size = 4, capacity 保持 4 v.push_back(5); // size = 5, capacity 触发重新分配,可能变为 8
你会发现,
capacity
push_back
优化策略:
reserve(n)
vector
reserve(n)
shrink_to_fit()
vector
size
capacity
vector
vector
capacity
size
shrink_to_fit()
vector
push_back
insert
erase
clear
vector
vector
理解
capacity
size
reserve
vector
std::vector
以上就是C++如何使用STL向量vector存储数据的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号