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

1 本课主要内容:

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

2 主要知识点:

  • 动态数组的使用场景

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

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

#include 

// std::vector 动态数组例子
std::vector vec1;                          // 空对象
std::vector vec2(10, 1);                   // 初始化为:10个元素,且值为1
std::vector vec3{ 1, 2, 3, 4, 5 };         // 初始化为:1 2 3 4 5
std::vector 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 

// std::vector 动态数组例子
std::vector vec1;                          // 空对象
std::vector vec2(10, 1);                   // 初始化为:10个元素,且值为1
std::vector vec3{ 1, 2, 3, 4, 5 };         // 初始化为:1 2 3 4 5
std::vector 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":退出程序

 附录:在线视频课程

【C++程序员必修第一课】C++基础课程

你可能感兴趣的:(c++,C++,vector,C++,动态数组,C++基础课程)