C++: vector

打印 上一主题 下一主题

主题 973|帖子 973|积分 2919

C++ std::vector 尺度库范例 

std::vector 是 C++ 尺度库中动态数组的实现,支持自动扩容、随机访问和高效的元素操纵。
 
1. 头文件与基本定义



  • 头文件:需包罗 <vector>。
  • 命名空间:属于 std 命名空间。
  • 基本声明
    1. #include <vector>
    2. using namespace std; // 或显式使用 std::vector
    复制代码

2. 初始化与构造

vector 支持多种初始化方式:
  1. vector<int> v1;             // 默认构造:空 vector
  2. vector<int> v2(5, 100);     // 含 5 个元素,每个值为 100
  3. vector<int> v3 = {1, 2, 3}; // 列表初始化(C++11 起)
  4. vector<int> v4(v3);         // 拷贝构造(v4 与 v3 相同)
  5. vector<int> v5(v3.begin(), v3.end()); // 通过迭代器范围构造
复制代码

3. 常用操纵

(1) 元素访问



  • 下标访问
    1. int a = v3[0];     // 访问第一个元素(不检查越界)
    2. int b = v3.at(1);  // 访问第二个元素(越界抛出 std::out_of_range)
    3. int c = v3.front(); // 首元素(等价于 v3[0])
    4. int d = v3.back();  // 尾元素(等价于 v3[v3.size()-1])
    复制代码
  • 范围查抄
    1. if (!v3.empty()) { // 确保 vector 非空
    2.     cout << v3[0];
    3. }
    复制代码
(2) 添加元素



  • 尾部插入
    1. v1.push_back(30);     // 添加元素 30 到尾部
    2. v1.emplace_back(40);  // 更高效(C++11,直接在容器内构造对象)
    复制代码
  • 恣意位置插入
    1. auto it = v3.begin() + 2;
    2. v3.insert(it, 99);  // 在索引 2 处插入 99 → {1, 2, 99, 3, 4, 5}
    复制代码
​(3) 删除元素



  • 尾部删除
    1. v3.pop_back();       // 删除最后一个元素 → {1, 2, 99, 3, 4}
    复制代码
  • 恣意位置删除
    1. auto it = v3.begin() + 2;
    2. v3.erase(it);        // 删除索引 2 处的元素 → {1, 2, 3, 4}
    3. v3.erase(v3.begin(), v3.begin() + 2); // 删除前两个元素 → {3, 4}
    复制代码
  • 清空 vector
    1. v3.clear();          // 清空所有元素,size 变为 0
    复制代码

4. 容量管理

(1) 容量与大小

  1. int size = v3.size();     // 元素数量
  2. bool isEmpty = v3.empty();// 是否为空
  3. int capacity = v3.capacity(); // 当前分配的存储容量(>= size)
复制代码
​(2) 调解容量



  • 预分配内存​(避免频仍扩容):
    1. v3.reserve(100); // 预分配容量为 100,size 不变
    复制代码
  • 调解元素数量
    1. v3.resize(10);    // 若 size < 10,填充默认值(int 为 0)
    2. v3.resize(5);     // 若 size > 5,截断后 5 个元素
    3. v3.resize(8, 99); // 填充 99 到新增位置
    复制代码

5. 迭代器与范围遍历

(1) 迭代器操纵

  1. // 正向迭代器
  2. for (auto it = v3.begin(); it != v3.end(); ++it) {
  3.     cout << *it << " ";
  4. }
  5. // 反向迭代器
  6. for (auto rit = v3.rbegin(); rit != v3.rend(); ++rit) {
  7.     cout << *rit << " ";
  8. }
  9. // C++11 范围 for 循环
  10. for (int num : v3) {
  11.     cout << num << " ";
  12. }
复制代码
(2) 迭代器失效问题



  • 插入/删除元素大概导致迭代器失效
    1. auto it = v3.begin() + 1;
    2. v3.push_back(10); // 可能导致迭代器失效(若触发扩容)
    3. // 此时使用 it 是未定义行为!
    复制代码
 

6. 性能与优化

(1) 动态扩容机制



  • 扩容计谋:当 size 超过 capacity 时,vector 会分配新内存(通常容量翻倍),并将旧元素拷贝到新内存。
  • 时间复杂度

    • 尾部插入(push_back):均派 O(1)。
    • 中间插入/删除:O(n)。

(2) 高效操纵建议



  • 批量插入
    1. vector<int> newData = {10, 20, 30};
    2. v3.insert(v3.end(), newData.begin(), newData.end());
    复制代码
  • 移动语义(C++11)​
    1. vector<string> v6;
    2. string str = "hello";
    3. v6.push_back(std::move(str)); // 移动而非拷贝,str 变为空
    复制代码

7. 算法与 vector 结合

  1. #include <algorithm>
  2. vector<int> nums = {3, 1, 4, 1, 5};
  3. sort(nums.begin(), nums.end());       // 排序:1, 1, 3, 4, 5
  4. auto it = find(nums.begin(), nums.end(), 4); // 查找元素 4 的位置
  5. reverse(nums.begin(), nums.end());    // 反转:5, 4, 3, 1, 1
复制代码
 ​8. 与数组的对比

特性std::vector原生数组 (int[])​内存管理自动扩容和释放手动管理​大小动态调解固定大小​访问效率雷同随机访问复杂度(O(1))雷同​安全性越界查抄(at() 方法)无查抄,越界导致未定义行为
9. 注意事项



  • 越界访问:operator[] 不查抄越界,at() 会抛出 std:ut_of_range。
  • 迭代器失效:插入/删除操纵大概导致迭代器、指针或引用失效。
  • ​vector<bool> 特化:避免使用 vector<bool>,其行为类似压缩位数组,与尺度容器不同等。
  • 避免频仍插入/删除中间元素:优先使用 std::list 或 std::deque。
  • 预分配内存:已知元素数量时,使用 reserve 淘汰扩容次数。
  • 元素范例要求:需支持拷贝或移动构造函数(如自定义类)。
​10. 综合示例

  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm> // 用于 sort
  4. using namespace std;
  5. int main() {
  6.     vector<int> nums = {3, 1, 4, 1, 5, 9, 2, 6};
  7.    
  8.     // 排序
  9.     sort(nums.begin(), nums.end()); // 1, 1, 2, 3, 4, 5, 6, 9
  10.    
  11.     // 去重
  12.     auto last = unique(nums.begin(), nums.end());
  13.     nums.erase(last, nums.end()); // 1, 2, 3, 4, 5, 6, 9
  14.    
  15.     // 遍历输出
  16.     for (int num : nums) {
  17.         cout << num << " ";
  18.     }
  19.     return 0;
  20. }
复制代码


11. 总结

核心上风说明动态大小无需预先指定容量,自动调解随机访问支持 O(1) 时间访问恣意元素内存安全自动管理内存,避免泄漏和越界与算法库无缝协作支持尺度库算法(如 sort, find)

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

石小疯

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表