推荐答案
-- -------------------- ---- ------- -------- -------- -------- ---------- --- ------ - -- ------ ------ ---------------- ---- -- - ------ ----- ------------------ ------------------ ------------------ -- -- ------ ---- --------- -- ------ -------- - -- ------ -- ---------- --------- -- ------- -------- - -- --------- -- ---------- -- -- ------ --- ---- - - -- - - ----------- ---- - --------- -- ------ -- - -- - --------- -- ---------- -- ------- ------ --- ----- -- - ------------ -- -- ---------- ----- - --------- -- --- -- - -- - --------- -- ---------- -- -------- --------------- -- -- ------ --- --------- -- ------- ----- - -- ---------- -- ---------- -- -- ------ ---- -- ------------- - --------- -- ------- -- ------ -- ---------- - ---- - --------- -- ------- -- --- ------ -- ---------- - ------ -- -
本题详细解读
1. std::vector
的特点
- 动态数组:
std::vector
是 C++ 标准库中的一个动态数组容器,能够自动管理内存,支持动态扩展和收缩。 - 连续存储:
std::vector
中的元素在内存中是连续存储的,因此可以通过指针算术来访问元素。 - 随机访问:
std::vector
支持通过下标([]
或at()
)快速访问任意位置的元素,时间复杂度为 O(1)。 - 自动扩容:当
std::vector
的容量不足以容纳新元素时,它会自动分配更大的内存空间,并将原有元素复制到新空间。 - 丰富的成员函数:
std::vector
提供了多种成员函数,如push_back()
、pop_back()
、size()
、empty()
等,方便操作和管理元素。
2. std::vector
的常用操作
创建
std::vector
:std::vector<int> vec; // 创建一个空的 vector std::vector<int> vec2(10); // 创建一个包含 10 个元素的 vector,初始值为 0 std::vector<int> vec3(10, 5); // 创建一个包含 10 个元素的 vector,初始值为 5
添加元素:
vec.push_back(10); // 在 vector 末尾添加元素 vec.insert(vec.begin() + 1, 20); // 在指定位置插入元素
访问元素:
int first = vec[0]; // 通过下标访问元素 int second = vec.at(1); // 通过 at() 方法访问元素,会进行边界检查
遍历
std::vector
:for (int i = 0; i < vec.size(); ++i) { std::cout << vec[i] << " "; } for (auto it = vec.begin(); it != vec.end(); ++it) { std::cout << *it << " "; }
删除元素:
vec.pop_back(); // 删除最后一个元素 vec.erase(vec.begin() + 1); // 删除指定位置的元素
获取大小和容量:
int size = vec.size(); // 获取 vector 中元素的数量 int capacity = vec.capacity(); // 获取 vector 当前分配的内存容量
清空
std::vector
:vec.clear(); // 清空 vector 中的所有元素
3. 注意事项
- 内存管理:虽然
std::vector
会自动管理内存,但在频繁插入和删除操作时,可能会导致多次内存重新分配,影响性能。可以通过reserve()
方法预先分配足够的内存来优化性能。 - 边界检查:使用
at()
方法访问元素时,如果下标越界,会抛出std::out_of_range
异常,而使用[]
操作符则不会进行边界检查。 - 迭代器失效:在
std::vector
中进行插入或删除操作时,可能会导致迭代器失效,需要特别注意。