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编程),定期会分享一些技术开发经验、行业资讯、业界动态等。期待您的关注,一起交流学习进步。
#下载示例源码和开发工具,请进入公众号首页,点击(发消息)最下方的(资源下载)菜单即可获取。
喜欢本文章,记得点赞、分享、关注哦~