• 【C++程序员必修第一课】C++基础课程-13:std::vector 动态数组


    1 本课主要内容:

    • 动态数组的使用场景?
    • std::vector 动态数组的声明
    • 基本使用:添加、赋值、访问、删除、遍历等
    • 学习 STL 标准模板库迭代器概念

    2 主要知识点:

    当数组的元素个数是不确定的,希望可以灵活的添加元素、或者删除某个元素,那就可以用到动态数组

    • std::vector 动态数组的声明

    1. #include
    2. // std::vector 动态数组例子
    3. std::vector<int> vec1; // 空对象
    4. std::vector<int> vec2(10, 1); // 初始化为:10个元素,且值为1
    5. std::vector<int> vec3{ 1, 2, 3, 4, 5 }; // 初始化为:1 2 3 4 5
    6. std::vector<int> vec4{ 1, 2 }; // 初始化为:1 2
    • 添加元素和赋值

    1. // 添加元素和修改赋值
    2. vec1.push_back(10); // 加到最后面
    3. vec1.insert(vec1.begin(), 11); // 加到最前面
    4. vec2[0] = 10; // 修改数据值(*必须确保数组0有值)
    5. vec2.at(1) = 20; // 修改数据值(*必须确保数组0有值)
    • 访问数组元素

    1. // 访问数组元素
    2. const int v1 = vec2[0]; // 使用 [INDEX] 访问
    3. const int v2 = vec2.at(1); // 使用 at(INDEX) 访问
    4. const int v3 = vec2.front(); // 访问第一个
    5. const int v4 = vec2.back(); // 访问最后一个
    • 遍历数组

    新知识点:通过STL迭代器来访问数组元素

    1. // 例子1:遍历 vector 数组
    2. for (const auto& v : vec3) {
    3. std::cout << v << std::endl;
    4. }
    5. // 例子2:通过迭代器来遍历
    6. for (auto iter = vec3.begin(); iter != vec3.end(); ++iter) {
    7. const int v = *iter;
    8. std::cout << v << std::endl;
    9. }
    • 删除元素

    1. // 删除第一个数据
    2. vec3.erase(vec3.begin());
    3. // 删除最后一个数据
    4. vec3.pop_back();
    5. // 删除指定数据
    6. for (auto iter = vec3.begin(); iter != vec3.end(); ) {
    7. const int v = *iter;
    8. if (v == 3) {
    9. std::cout << "delete v:" << v << std::endl;
    10. // 删除指定数组
    11. iter = vec3.erase(iter);
    12. }
    13. else {
    14. std::cout << "other v:" << v << std::endl;
    15. ++iter;
    16. }
    17. }
    • 其他常用函数

    1. // 数组大小
    2. const int vec2Size = vec2.size();
    3. std::cout << "vec2.size() = " << vec2Size << std::endl;
    4. // 判断数组是否为空
    5. const bool isEmpty = vec2.empty();
    6. std::cout << "array.empty() = " << isEmpty << std::endl;
    7. // 清空所有数据
    8. vec4.clear();
    • 完整例子代码

    1. #include
    2. // std::vector 动态数组例子
    3. std::vector<int> vec1; // 空对象
    4. std::vector<int> vec2(10, 1); // 初始化为:10个元素,且值为1
    5. std::vector<int> vec3{ 1, 2, 3, 4, 5 }; // 初始化为:1 2 3 4 5
    6. std::vector<int> vec4{ 1, 2 }; // 初始化为:1 2
    7. // 数组赋值
    8. vec1.push_back(10); // 加到最后面
    9. vec1.insert(vec1.begin(), 11); // 加到最前面
    10. vec2[0] = 10; // 修改数据值(*必须确保数组0有值)
    11. vec2.at(1) = 20; // 修改数据值(*必须确保数组0有值)
    12. // 访问数组元素
    13. const int v1 = vec2[0]; // 使用 [INDEX] 访问
    14. const int v2 = vec2.at(1); // 使用 at(INDEX) 访问
    15. const int v3 = vec2.front(); // 访问第一个
    16. const int v4 = vec2.back(); // 访问最后一个
    17. std::cout << "vec2[0] = " << v1 << std::endl;
    18. std::cout << "vec2.at(1) = " << v2 << std::endl;
    19. std::cout << "vec2.front() = " << v3 << std::endl;
    20. std::cout << "vec2.back() = " << v4 << std::endl;
    21. // 例子1:遍历 vector 数组
    22. for (const auto& v : vec3) {
    23. std::cout << v << std::endl;
    24. }
    25. // 例子2:通过迭代器来遍历
    26. for (auto iter = vec3.begin(); iter != vec3.end(); ++iter) {
    27. const int v = *iter;
    28. std::cout << v << std::endl;
    29. }
    30. // 删除第一个数据
    31. vec3.erase(vec3.begin());
    32. // 删除最后一个数据
    33. vec3.pop_back();
    34. // 删除指定数据
    35. for (auto iter = vec3.begin(); iter != vec3.end(); ) {
    36. const int v = *iter;
    37. if (v == 3) {
    38. std::cout << "delete v:" << v << std::endl;
    39. // 通过迭代器删除指定数据
    40. iter = vec3.erase(iter);
    41. }
    42. else {
    43. std::cout << "other v:" << v << std::endl;
    44. ++iter;
    45. }
    46. }
    47. // 数组大小
    48. const int vec2Size = vec2.size();
    49. std::cout << "vec2.size() = " << vec2Size << std::endl;
    50. // 判断数组是否为空
    51. const bool isEmpty = vec2.empty();
    52. std::cout << "array.empty() = " << isEmpty << std::endl;
    53. // 清空所有数据
    54. vec4.clear();

    3 注意事项:

    • 访问动态数组需要注意下标越界,就是 vecotr[index], vector.at(index) 访问数组时 index
    • 尽量不用 insert() 在前面和中间插入元素,也不用 erase() 在前面和中间删除元素;vector属于成片内存管理元素,insert 和 erase 会引起元素重新移位

    4 课后练习:

    • 设计一个用户管理程序,用 while 循环提示用户输入指令,指令对应功能如下:
    • "add":添加用户;需要再提示用户输入用户名称,把用户名称添加到 vector 动态数组;
    • "delete":删除最后一个用户
    • "list":打印出所有用户名称
    • "quit":退出程序

     附录:在线视频课程

    进入视频号学习本文配套视频课程。

    -【End】-

    哈喽,大家好!我是喜欢coding的小二,一枚“靓仔又不掉头发”的C++开发大头兵;欢迎围观公众号(20YC编程),定期会分享一些技术开发经验、行业资讯、业界动态等。期待您的关注,一起交流学习进步。

    #下载示例源码和开发工具,请进入公众号首页,点击(发消息)最下方的(资源下载)菜单即可获取。

    喜欢本文章,记得点赞、分享、关注哦~

  • 相关阅读:
    东风至,数智生 | “算力+”发力工业互联网,助迎新突破
    MinIO (三) 使用Webhook实时同步文件
    TikTok营销 如何进行TikTok养号?有什么简单有用的技巧
    Freeswitch操作基本配置
    小美的外卖订单编号---牛客周赛 Round 11
    ES & Kibana windows 安装
    OpenCV图像学习八,图像归一化盒子滤波处理和图像高斯滤波处理实现
    切面编程@Aspect 获取 url参数 + requestBody参数
    LeetCode-201. 数字范围按位与-Java-medium
    索引的数据结构(2)
  • 原文地址:https://blog.csdn.net/yanghz/article/details/133975026