std::vector是C++中处理动态数组的首选容器,它提供自动内存管理、动态扩容、安全访问及与STL算法的良好集成。与固定大小的C风格数组和std::array不同,vector在堆上分配内存,支持运行时动态增减元素,适用于大小不确定或频繁变化的场景。其核心优势包括:自动扩容(通常按指数增长,均摊O(1)的push_back性能)、安全的边界检查(at()方法)、丰富的操作接口(如insert、erase、reserve等)。然而,在中间插入或删除元素需O(N)时间,效率较低,此时应考虑list或deque。推荐使用基于范围的for循环遍历,兼顾安全与简洁;若需索引或反向遍历,可选用索引或迭代器方式。通过reserve预分配内存可避免频繁扩容,提升性能;shrink_to_fit可尝试释放多余容量。总之,vector在安全性、灵活性和性能之间实现了良好平衡,是绝大多数动态数组场景下的首选方案。

C++的
std::vector
vector
使用
std::vector
vector
std::vector<int> myNumbers;
vector
push_back()
vector
myNumbers.push_back(10);
myNumbers[0]
at()
pop_back()
erase()
vector
new
delete
在我看来,
std::vector
int arr[10];
std::array
std::array<int, 10> arr;
std::array
立即学习“C++免费学习笔记(深入)”;
而
std::vector
vector
vector
vector
std::sort
std::find
std::for_each
vector
at()
vector
总的来说,如果不是有非常特殊的理由(比如与C语言接口、极致的栈内存控制),我几乎总是倾向于使用
std::vector
谈到
vector
push_back()
push_back()
push_back
vector
vector
insert()
erase()
vector
insert(pos, value)
pos
pos
erase(pos)
pos
pos
vector
insert
erase
std::list
std::deque
reserve()
shrink_to_fit()
reserve(capacity)
vector
reserve()
myVector.reserve(1000);
shrink_to_fit()
vector
size()
vector
总的来说,理解
vector
vector
vector
遍历和操作
vector
基于范围的for循环(Range-based for loop,C++11及更高版本): 这是我个人最推荐的遍历方式,因为它简洁、直观且不易出错。
std::vector<int> numbers = {1, 2, 3, 4, 5};
for (int num : numbers) { // 按值拷贝,不修改原vector元素
// 对num进行操作
std::cout << num << " ";
}
// 如果需要修改vector元素,使用引用
for (int& num : numbers) {
num *= 2; // 修改了vector中的元素
}它的优点在于代码量少,可读性高,自动处理迭代器的生命周期,避免了手动管理迭代器可能导致的错误。
传统索引循环: 这种方式与C风格数组的遍历类似,通过索引访问元素。
std::vector<std::string> names = {"Alice", "Bob", "Charlie"};
for (size_t i = 0; i < names.size(); ++i) {
std::cout << names[i] << " "; // 使用[]运算符
}这种方式在需要知道当前元素索引时非常有用。然而,使用
[]
i
[0, names.size() - 1]
at()
for (size_t i = 0; i < names.size(); ++i) {
try {
std::cout << names.at(i) << " "; // 使用at()进行边界检查
} catch (const std::out_of_range& e) {
std::cerr << "Error: " << e.what() << std::endl;
}
}at()
std::out_of_range
迭代器循环: 这是STL容器通用的遍历方式,提供了最大的灵活性。
std::vector<double> values = {1.1, 2.2, 3.3};
for (auto it = values.begin(); it != values.end(); ++it) {
std::cout << *it << " ";
}
// 如果需要反向遍历
for (auto rit = values.rbegin(); rit != values.rend(); ++rit) {
std::cout << *rit << " ";
}迭代器特别适用于在遍历过程中进行插入或删除操作(但需要小心迭代器失效问题)。
begin()
end()
rbegin()
rend()
常见操作:
empty()
size()
vector.empty()
vector
vector.size() == 0
vector.size()
clear()
vector
pop_back()
vector
resize(new_size)
vector
new_size
new_size
front()
back()
vector
选择哪种遍历方式,取决于具体需求。对于简单的只读或修改元素,基于范围的for循环是首选。需要索引或更精细控制时,传统索引循环或迭代器循环就派上用场了。关键是理解每种方式的特点,并结合实际情况做出最安全、最有效的选择。
以上就是C++ vector容器使用 动态数组操作指南的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号