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

1 本课主要内容:

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

2 主要知识点:

  • 动态数组的使用场景

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

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

#include <vector>

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

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

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

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

// 例子1:遍历 vector 数组
for (const auto& v : vec3) {
    std::cout << v << std::endl;
}

// 例子2:通过迭代器来遍历
for (auto iter = vec3.begin(); iter != vec3.end(); ++iter) {
    const int v = *iter;
    std::cout << v << std::endl;
}
  • 删除元素

// 删除第一个数据
vec3.erase(vec3.begin());
// 删除最后一个数据
vec3.pop_back();

// 删除指定数据
for (auto iter = vec3.begin(); iter != vec3.end(); ) {
    const int v = *iter;
    if (v == 3) {
        std::cout << "delete v:" << v << std::endl;
        // 删除指定数组
        iter = vec3.erase(iter);
    }
    else {
        std::cout << "other v:" << v << std::endl;
        ++iter;
    }
}
  • 其他常用函数

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

#include <vector>

// std::vector 动态数组例子
std::vector<int> vec1;                          // 空对象
std::vector<int> vec2(10, 1);                   // 初始化为:10个元素,且值为1
std::vector<int> vec3{ 1, 2, 3, 4, 5 };         // 初始化为:1 2 3 4 5
std::vector<int> vec4{ 1, 2 };                  // 初始化为:1 2
// 数组赋值
vec1.push_back(10);             // 加到最后面
vec1.insert(vec1.begin(), 11);  // 加到最前面
vec2[0] = 10;                   // 修改数据值(*必须确保数组0有值)
vec2.at(1) = 20;                // 修改数据值(*必须确保数组0有值)
// 访问数组元素
const int v1 = vec2[0];         // 使用 [INDEX] 访问
const int v2 = vec2.at(1);      // 使用 at(INDEX) 访问
const int v3 = vec2.front();    // 访问第一个
const int v4 = vec2.back();     // 访问最后一个
std::cout << "vec2[0] = " << v1 << std::endl;
std::cout << "vec2.at(1) = " << v2 << std::endl;
std::cout << "vec2.front() = " << v3 << std::endl;
std::cout << "vec2.back() = " << v4 << std::endl;
// 例子1:遍历 vector 数组
for (const auto& v : vec3) {
    std::cout << v << std::endl;
}

 // 例子2:通过迭代器来遍历
for (auto iter = vec3.begin(); iter != vec3.end(); ++iter) {
    const int v = *iter;
    std::cout << v << std::endl;
}

// 删除第一个数据
vec3.erase(vec3.begin());
// 删除最后一个数据
vec3.pop_back();
// 删除指定数据
for (auto iter = vec3.begin(); iter != vec3.end(); ) {
    const int v = *iter;
    if (v == 3) {
        std::cout << "delete v:" << v << std::endl;
        // 通过迭代器删除指定数据
        iter = vec3.erase(iter);
    }
    else {
        std::cout << "other v:" << v << std::endl;
        ++iter;
    }
}

// 数组大小
const int vec2Size = vec2.size();
std::cout << "vec2.size() = " << vec2Size << std::endl;
// 判断数组是否为空
const bool isEmpty = vec2.empty();
std::cout << "array.empty() = " << isEmpty << std::endl;
// 清空所有数据
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编程),定期会分享一些技术开发经验、行业资讯、业界动态等。期待您的关注,一起交流学习进步。

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天恩软件工作室

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值