(C++)任务管理系统(正式版)(迭代器)(list列表基础教程)(STL基础知识)

源代码:

#include <iostream>
#include <list>
#include <string>using namespace std;void menu(){cout<<"\n===== 任务管理系统 ====="<<endl;cout<<"1.添加普通任务"<<endl;cout<<"2.添加紧急任务"<<endl;cout<<"3.完成一个任务"<<endl;cout<<"4.打印剩余任务"<<endl;cout<<"0.保存并退出  "<<endl;cout<<"请输入你的选择:"<<endl;
}void print_task(list<string>& task_list){int count=0;if(task_list.empty()){cout<<"暂时没有任务"<<endl;return;}cout<<"\n===== 当前剩余任务 ====="<<endl;for(auto& task:task_list){	cout<<task<<endl;count++;}cout<<"当前任务数:"<<count<<endl;return;
}void add_task(list<string>& task_list){string a;cout<<"请输入一个普通任务:"<<endl;cin>>a;task_list.push_back(a);cout<<"添加成功!"<<endl;print_task(task_list);return;
}void add_urgent_task(list<string>& task_list){string a;cout<<"请输入一个紧急任务:"<<endl;cin>>a;task_list.push_front(a);cout<<"添加成功!"<<endl;print_task(task_list);return;
}void complete_task(list<string>& task_list){if(task_list.empty()){cout<<"暂时没有任务"<<endl;return;}string completetask=task_list.front();task_list.pop_front();cout<<"完成任务:"<<completetask<<endl;print_task(task_list);return;
}int main(){int choice;list<string> task_list;while(true){menu();cin>>choice;switch (choice) {case 0:cout<<"感谢使用,再见"<<endl;return 0;case 1:add_task(task_list);break;case 2:add_urgent_task(task_list);break;case 3:complete_task(task_list);break;case 4:print_task(task_list);break;default:cout<<"输入有误 请重新选择!"<<endl;break;}}return 0;
}

代码解析:

一.头文件和命名空间

//头文件
#include <iostream>//输入流和输出流
#include <list>//list列表
#include <string>//字符串的使用using namespace std;//命名空间

1. #include <iostream> - 输入输出功能

  • 作用:让程序能够进行输入(键盘)和输出(屏幕)操作

  • 包含的关键功能

    • cout:用于向屏幕输出文本(如 cout << "Hello"

    • cin:用于从键盘获取输入(如 cin >> name

    • endl:用于换行(相当于按回车键)

  • 类比:就像给电脑安装了"眼睛"(输入)和"嘴巴"(输出)

2. #include <list> - 链表容器

  • 作用:提供双向链表(list)数据结构

  • 包含的关键功能

    • list<int>:创建整数链表

    • push_back():在末尾添加元素

    • push_front():在开头添加元素

    • pop_back():删除末尾元素

    • pop_front():删除开头元素

  • 特点:适合频繁在任意位置插入/删除元素

  • 类比:像一根可以随意插入珠子的珍珠项链

3. #include <string> - 字符串处理

  • 作用:提供字符串操作功能

  • 包含的关键功能

    • string:创建字符串变量(如 string name = "Alice"

    • +:拼接字符串(如 "Hello" + name

    • size():获取字符串长度

    • >>/<<:输入输出字符串

  • 类比:给电脑安装处理文字的能力

4. using namespace std; - 命名空间

  • 作用:避免每次都要写 std:: 前缀

  • 效果对比

    // 不使用命名空间
    std::cout << "Hello";
    std::list<int> numbers;// 使用命名空间
    cout << "Hello";
    list<int> numbers;
  • 为什么需要:C++标准库的所有功能都在 std 命名空间中

  • 新手注意:在小型程序中使用没问题,但在大型项目中可能引起命名冲突

可视化比喻:建造房子 🏠

  1. #include <iostream> → 门窗系统(输入输出通道)

  2. #include <list> → 可调整的储物架(灵活的数据容器)

  3. #include <string> → 标签和便签(文字处理工具)

  4. using namespace std; → 万能工具箱(直接使用标准工具不用找)

二.menu()函数

void menu(){cout<<"\n===== 任务管理系统 ====="<<endl;cout<<"1.添加普通任务"<<endl;cout<<"2.添加紧急任务"<<endl;cout<<"3.完成一个任务"<<endl;cout<<"4.打印剩余任务"<<endl;cout<<"0.保存并退出  "<<endl;cout<<"请输入你的选择:"<<endl;
}

 主要利用输出流打印可视化可选择菜单

三.print_task()函数

void print_task(list<string>& task_list){int count=0;if(task_list.empty()){cout<<"暂时没有任务"<<endl;return;}cout<<"\n===== 当前剩余任务 ====="<<endl;for(auto& task:task_list){	cout<<task<<endl;count++;}cout<<"当前任务数:"<<count<<endl;return;
}

1. 函数定义

void print_task(list<string>& task_list)
  • void:表示这个函数不返回任何值

  • print_task:函数名称(打印任务)

  • list<string>& task_list:参数说明

    • list<string>:字符串链表类型

    • &:引用传递(避免复制整个列表)

    • task_list:要打印的任务列表

2. 计数器初始化

int count = 0;
  • 创建一个计数器变量 count

  • 初始值为0(准备统计任务数量)

3. 空列表检查

if (task_list.empty()) {cout << "暂时没有任务" << endl;return;
}
  • empty():检查列表是否为空

  • 如果列表为空:

    • 打印提示信息 "暂时没有任务"

    • return:立即结束函数(不执行后面的代码)

4. 打印标题

cout << "\n===== 当前剩余任务 =====" << endl;
  • \n:先换一行(空行)

  • 打印装饰性的标题

5. 遍历任务列表

for (auto& task : task_list) {cout << task << endl;count++;
}
  • 范围for循环:高效遍历整个列表

  • auto& task:自动类型推导+引用(避免字符串拷贝)

    • auto:自动识别元素类型(这里是string)

    • &:引用(直接访问原始数据)

  • 循环体:

    • cout << task << endl:打印任务内容并换行

    • count++:计数器+1(统计任务数量)

6. 打印任务总数

cout << "当前任务数:" << count << endl;
  • 输出统计结果

  • endl:换行并刷新输出缓冲区

7. 函数结束

return;
  • 显式结束函数(void函数可以省略)

可视化执行流程

开始
↓
创建计数器 count=0
↓
检查任务列表是否为空? → 是 → 打印"暂时没有任务" → 结束
↓
否
↓
打印标题 "===== 当前剩余任务 ====="
↓
遍历任务列表:任务1 → 打印 → 计数+1任务2 → 打印 → 计数+1...任务N → 打印 → 计数+1
↓
打印"当前任务数:N"
↓
结束

 四.add_task()函数

void add_task(list<string>& task_list){string a;cout<<"请输入一个普通任务:"<<endl;cin>>a;task_list.push_back(a);cout<<"添加成功!"<<endl;print_task(task_list);return;
}

1. 创建临时变量

string a;
  • 创建一个字符串变量 a

  • 作用:临时存储用户输入的任务内容

  • 生命周期:只在函数执行期间存在

2. 显示提示信息

cout << "请输入一个普通任务:" << endl;
  • cout:输出到屏幕

  • 提示用户需要输入什么内容

  • endl:换行并刷新输出缓冲区

3. 获取用户输入

cin >> a;
  • cin:从键盘获取输入

  • >>:输入操作符

  • 用户输入的内容会存储到变量 a 中

  • 注意:这种方式只能读取单个单词(遇到空格会停止)

4. 添加任务到列表

task_list.push_back(a);
  • task_list:我们要修改的任务列表

  • .push_back():list 的成员函数,在末尾添加元素

  • a:用户输入的任务内容

  • 效果:任务被添加到列表的最后位置

5. 操作反馈

cout << "添加成功!" << endl;
  • 给用户明确的反馈,表示操作已完成

  • 良好的用户体验设计

6. 打印更新后的列表

print_task(task_list);
  • 调用之前定义的打印函数

  • 显示添加新任务后的完整列表

  • 让用户直观看到变化

可视化执行流程

开始
↓
创建临时变量a
↓
显示提示:"请输入一个普通任务:"
↓
等待用户输入 → 用户输入"写作业"
↓
将"写作业"存入变量a
↓
将a的内容添加到task_list末尾
↓
显示"添加成功!"
↓
调用print_task显示更新后的列表
↓
结束

五.add_urgent_task()函数

函数分解说明(与普通任务添加对比)

1-3. 输入部分(相同)

  • 创建临时变量 a

  • 显示提示信息(但内容改为"紧急任务")

  • 使用 cin >> a 获取输入(同样有空格限制问题)

4. 关键区别:添加位置

task_list.push_front(a);  // 添加到列表开头
  • 普通任务函数:push_back() → 添加到末尾

  • 紧急任务函数:push_front() → 添加到开头

  • 这正是链表的优势所在:在开头添加元素非常高效(O(1)时间复杂度)

5-7. 反馈与结束(相同)

  • 显示添加成功提示

  • 调用打印函数显示更新后的列表

  • 显式返回

可视化执行流程(对比普通任务)

普通任务添加流程:
开始 → 输入任务 → 添加到列表末尾 → 打印列表紧急任务添加流程:
开始 → 输入任务 → 添加到列表开头 → 打印列表

六.complete_task()函数

1. 空列表检查

if(task_list.empty()) {cout << "暂时没有任务" << endl;return;
}
  • 安全防护:防止在空列表上操作导致程序崩溃

  • empty():检查列表是否为空

  • 如果为空:显示提示信息并直接退出函数

2. 获取第一个任务

string completetask = task_list.front();
  • front():获取列表的第一个元素(但不移除)

  • 将任务内容保存到变量 completetask 中

  • 这样可以在移除后还能显示已完成的任务

3. 移除第一个任务

task_list.pop_front();
  • pop_front():移除列表的第一个元素

  • 重要特性:这是链表的高效操作(O(1)时间复杂度)

  • 执行后:列表长度减少1,后续任务向前移动

4. 显示完成信息

cout << "完成任务:" << completetask << endl;
  • 给用户明确反馈

  • 显示具体完成了哪个任务

  • 提升用户体验

5. 打印更新后的列表

print_task(task_list);
  • 调用之前定义的打印函数

  • 显示移除任务后的最新列表状态

  • 让用户看到当前剩余任务

可视化执行流程

开始
↓
检查列表是否为空?是 → 显示"暂时没有任务" → 结束否 → 继续
↓
获取第一个任务内容 → 存入completetask
↓
从列表中移除第一个任务
↓
显示"完成任务:XXX"
↓
打印更新后的任务列表
↓
结束

七.主函数

int main(){int choice;list<string> task_list;while(true){menu();cin>>choice;switch (choice) {case 0:cout<<"感谢使用,再见"<<endl;return 0;case 1:add_task(task_list);break;case 2:add_urgent_task(task_list);break;case 3:complete_task(task_list);break;case 4:print_task(task_list);break;default:cout<<"输入有误 请重新选择!"<<endl;break;}}return 0;
}

注:该代码是本人自己所写,可能不够好,不够简便,欢迎大家指出我的不足之处。如果遇见看不懂的地方,可以在评论区打出来,进行讨论,或者联系我。上述内容全是我自己理解的,如果你有别的想法,或者认为我的理解不对,欢迎指出!!!如果可以,可以点一个免费的赞支持一下吗?谢谢各位彦祖亦菲!!!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/88744.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/88744.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

创建uniapp项目引入uni-id用户体系使用beforeRegister钩子创建默认昵称

需求描述 基于uniCloud开发项目&#xff0c;通常会使用用户体系&#xff0c;uni-id就是基于uniCloud的用户体系&#xff0c;满足常规需要的账号密码注册、登录&#xff0c;微信登录等快捷方式&#xff0c;如果使用uni-id自带的uni-id-pages插件&#xff0c;账号密码注册的话&a…

Opencv---深度学习开发

在OpenCV中进行深度学习开发&#xff0c;主要围绕其dnn模块展开&#xff0c;该模块支持加载预训练模型、预处理输入数据、执行推理计算以及解析输出结果。本文讲解基于OpenCV进行深度学习开发的基本流程。 一、准备工作 在开始开发前&#xff0c;需完成环境配置和资源准备&…

【C++11】右值引用详解

文章目录前言1. 左、右值的概念1.1 左值1.2 右值1.3 右值引用2. 右值引用的价值和使用场景2.1 左值引用的价值和缺陷2.2 右值引用的价值和使用场景2.3 小结3. 完美转发4. 类的移动构造和移动赋值前言 在C11之前&#xff0c;面对C11之前出现的临时对象的传参构造&#xff0c;都…

如何用自指理解世界

自指即自我指涉&#xff0c;即自己的描述关联到了自己&#xff0c;典型例子是“这句话是假话”这个悖论。人类对自指的研究由来已久&#xff0c;很多概念、定理都与之相关&#xff0c;由于它的巧妙性&#xff0c;很多学者对其展开了深入研究&#xff0c;并且认为自指是理解宇宙…

Next.js 实战笔记 2.0:深入 App Router 高阶特性与布局解构

Next.js 实战笔记 2.0&#xff1a;深入 App Router 高阶特性与布局解构 上一篇笔记&#xff1a; Next.js 实战笔记 1.0&#xff1a;架构重构与 App Router 核心机制详解 上篇笔记主要回顾了一些 Next12 到 Next15 的一些变化&#xff0c;这里继续学习/复习一些已有或者是新的…

TCP 传输时 sk_buff 的 clone 和 unclone

周一有位朋友咨询个问题&#xff0c;问题本身不重要&#xff0c;但牵扯出的细节却是非常有趣。 Linux 内核协议栈的 skb 设计非常高效和精巧&#xff0c;多个 skb 可以指向同一块 data&#xff0c;这就是 clone&#xff0c;当 data 不止一个 skb 指示时&#xff0c;任何一个 s…

【51单片机】51单片机学习笔记-课程简介

00. 目录 文章目录00. 目录01. 学习哪种类型的单片机02. 学习单片机方法03. 学习单片机硬件设备04. 学习单片机软件设备05. 学完单片机能做什么06. 附录01. 学习哪种类型的单片机 单片机的型号那么多&#xff0c;该如何选择一款合适的进行学习呢&#xff1f;这里给读者首推的当…

【Docker基础】Docker端口映射(-p参数)深度解析与实践指南

目录 前言 1 Docker网络基础 1.1 Docker网络模型概述 1.2 容器网络隔离性 2 端口映射基础 2.1 端口映射概念 2.2 为什么需要端口映射 3 -p参数详解 3.1 基本语法 3.2 四种映射格式 3.2.1 完整格式 3.2.2 省略宿主机IP 3.2.3 随机宿主机端口 3.2.4 指定协议类型 …

2、鸿蒙Harmony Next开发:ArkTS语言

目录 什么是ArkTS&#xff1f; ArkTS的发展趋势 ArkTS的定位及约束 ArkTS的对UI的拓展 1、UI描述 2、状态管理&#xff1a; ArkTS语法基础 基本知识&#xff1a;声明 基本知识&#xff1a;类型 基本知识&#xff1a;空安全 基本知识&#xff1a;类型安全与类型推断 …

【Elasticsearch】function_score

如果你希望在 Elasticsearch 查询中降低某些特定 `id` 的文档评分,可以通过 `function_score` 查询结合 `script_score` 函数来实现。`script_score` 允许你使用自定义脚本对文档的评分进行调整。 以下是一个示例,展示如何降低某些特定 `id` 的文档评分: 示例场景 假设我们…

vscode打开stm32CubeIDE的项目的注释问题

文章目录 目的是为消除红色底线打开命令面板&#xff1a;CtrlShiftP 搜索并打开&#xff1a;C/C: Edit Configurations (JSON) 修改并添加。&#xff08;注意里面的版本号&#xff09; {"configurations": [{"name": "Win32","includePath&…

ESP32使用freertos更新lvgl控件内容

LVGL不是线程安全&#xff0c;所有 lv_xxx方法只能在GUI主线程调用。 freertos都是线程池&#xff0c;子线程&#xff0c;不能直接更新lvgl&#xff0c;不然看门狗被触发&#xff0c;死机。 推荐方法案例&#xff1a; 假如搜索wifi列表得到参数是wifi_options&#xff0c;需要通…

OBOO鸥柏丨满天星(MTSTAR)多媒体信息发布系统技术解析

初次启动欢迎您使用鸥柏(OBOO)满天星(MTSTAR)多媒体信息发布系统&#xff0c;在使用本系统的独立服务器模式前&#xff0c;我们需要完成设备的一些必须设置教程技术说明。其总体流程分为两步&#xff1a;录入本地服务器IP地址->连接网络您获取到的OBOO鸥柏满天星(MTSTAR)液晶…

数据结构:栈、队列、链表

目录 栈 ​队列 链表 栈 栈数据结构特点&#xff1a;先入栈的数据后出&#xff0c;此数据结构常用的方法有&#xff1a;入栈push、出栈pop、查看栈顶元素peek等&#xff0c;下方示例以数组实现栈结构。 package com.ginko.datastructure; import lombok.extern.slf4j.Slf4j…

Python-难点-uinttest

1 需求要求&#xff1a;unittest.TestCase放在列表中&#xff0c;列表存储的是脚本文件名import使用动态加载方式&#xff1a;importlib.import_module()unittest.TestLoader使用loadTestsFromModule()2 接口3 示例4 参考资料

开源 python 应用 开发(五)python opencv之目标检测

最近有个项目需要做视觉自动化处理的工具&#xff0c;最后选用的软件为python&#xff0c;刚好这个机会进行系统学习。短时间学习&#xff0c;需要快速开发&#xff0c;所以记录要点步骤&#xff0c;防止忘记。 链接&#xff1a; 开源 python 应用 开发&#xff08;一&#xf…

ABP VNext + OpenTelemetry + Jaeger:分布式追踪与调用链可视化

ABP VNext OpenTelemetry Jaeger&#xff1a;分布式追踪与调用链可视化 &#x1f680; &#x1f4da; 目录ABP VNext OpenTelemetry Jaeger&#xff1a;分布式追踪与调用链可视化 &#x1f680;背景与动机 &#x1f31f;环境与依赖 &#x1f4e6;必装 NuGet 包系统架构概览…

C语言中整数编码方式(原码、反码、补码)

在 C 语言中&#xff0c;原码、反码、补码的运算规则与其编码特性密切相关&#xff0c;核心差异体现在符号位是否参与运算、进位如何处理以及减法是否能转化为加法等方面。以下是三者的运算规则及特点分析&#xff08;以 8 位整数为例&#xff0c;符号位为最高位&#xff09;&a…

js二维数组如何变为一维数组

在 JavaScript 中&#xff0c;将二维数组转换为一维数组&#xff08;扁平化&#xff09;有多种方法&#xff0c;可根据数组结构复杂度、性能需求和兼容性选择。以下是最常用的实现方式&#xff1a; 1. 使用 flat() 方法&#xff08;ES2019&#xff09; MDN释义&#xff1a;flat…

Claude code在Windows上的配置流程

前言 昨天在服务器上配置好了 Claude code&#xff0c;发现其编码性能和效率都非常不错。 然而&#xff0c;尝试用它修改带 UI 界面的客户端程序时颇为不便&#xff0c;因为服务器没有图形化界面&#xff0c;无法直接将应用界面直接显示到开发机上&#xff0c;调试起来颇为不…