- 动态数组的使用场景?
- std::vector 动态数组的声明
- 基本使用:添加、赋值、访问、删除、遍历等
- 学习 STL 标准模板库迭代器概念
当数组的元素个数是不确定的,希望可以灵活的添加元素、或者删除某个元素,那就可以用到动态数组
- #include
-
- // 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
-
- // 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();
- 访问动态数组需要注意下标越界,就是 vecotr[index], vector.at(index) 访问数组时 index
- 尽量不用 insert() 在前面和中间插入元素,也不用 erase() 在前面和中间删除元素;vector属于成片内存管理元素,insert 和 erase 会引起元素重新移位
- 设计一个用户管理程序,用 while 循环提示用户输入指令,指令对应功能如下:
- "add":添加用户;需要再提示用户输入用户名称,把用户名称添加到 vector 动态数组;
- "delete":删除最后一个用户
- "list":打印出所有用户名称
- "quit":退出程序
进入视频号学习本文配套视频课程。
-【End】-
哈喽,大家好!我是喜欢coding的小二,一枚“靓仔又不掉头发”的C++开发大头兵;欢迎围观公众号(20YC编程),定期会分享一些技术开发经验、行业资讯、业界动态等。期待您的关注,一起交流学习进步。
#下载示例源码和开发工具,请进入公众号首页,点击(发消息)最下方的(资源下载)菜单即可获取。

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