(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
英文地址,請注明出處:http://en.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;調試起來頗為不…