(C++)list列表相關基礎用法(C++教程)(STL庫基礎教程)

源代碼:

#include <iostream>
#include <list>using namespace std;int main(){list<int> numbers={10,20,30};numbers.push_front(5);numbers.push_back(40);auto it =numbers.begin();advance(it,2);numbers.insert(it,15);cout<<"該列表的數為:";for(int num:numbers){cout<<num<<"\t";}numbers.remove(15);numbers.push_front(99);numbers.sort();cout<<endl;cout<<"該列表的數為:";for(int num:numbers){cout<<num<<"\t";}
}

運行結果:

該列表的數為:5 10      15      20      30      40
該列表的數為:5 10      20      30      40      99
請按任意鍵繼續. . .

代碼詳解與相關知識:

C++?std::list?代碼解析及與C語言的對比

原始代碼解析

#include <iostream>
#include <list>using namespace std;int main(){// 初始化一個包含3個元素的listlist<int> numbers = {10, 20, 30};// 在頭部插入元素5numbers.push_front(5);// 在尾部插入元素40numbers.push_back(40);// 獲取迭代器并前進2個位置auto it = numbers.begin();advance(it, 2);// 在指定位置插入15numbers.insert(it, 15);// 輸出當前列表cout << "該列表的數為:";for(int num : numbers){cout << num << "\t";}// 刪除所有值為15的元素numbers.remove(15);// 在頭部插入99numbers.push_front(99);// 排序列表numbers.sort();// 輸出最終列表cout << endl;cout << "該列表的數為:";for(int num : numbers){cout << num << "\t";}
}

代碼執行流程

  1. 初始化列表:[10, 20, 30]

  2. 頭部插入5:[5, 10, 20, 30]

  3. 尾部插入40:[5, 10, 20, 30, 40]

  4. 在位置2插入15:[5, 10, 15, 20, 30, 40]

  5. 刪除15:[5, 10, 20, 30, 40]

  6. 頭部插入99:[99, 5, 10, 20, 30, 40]

  7. 排序后:[5, 10, 20, 30, 40, 99]

C語言實現對比

C語言鏈表實現(等效功能)

#include <stdio.h>
#include <stdlib.h>typedef struct Node {int data;struct Node* prev;struct Node* next;
} Node;Node* createNode(int value) {Node* newNode = (Node*)malloc(sizeof(Node));newNode->data = value;newNode->prev = NULL;newNode->next = NULL;return newNode;
}void insertFront(Node** head, int value) {Node* newNode = createNode(value);if (*head == NULL) {*head = newNode;return;}newNode->next = *head;(*head)->prev = newNode;*head = newNode;
}void insertBack(Node** head, int value) {Node* newNode = createNode(value);if (*head == NULL) {*head = newNode;return;}Node* temp = *head;while (temp->next != NULL) {temp = temp->next;}temp->next = newNode;newNode->prev = temp;
}void insertAt(Node** head, int position, int value) {if (position == 0) {insertFront(head, value);return;}Node* newNode = createNode(value);Node* temp = *head;for (int i = 0; temp != NULL && i < position - 1; i++) {temp = temp->next;}if (temp == NULL) {free(newNode);return;}newNode->next = temp->next;if (temp->next != NULL) {temp->next->prev = newNode;}temp->next = newNode;newNode->prev = temp;
}void deleteValue(Node** head, int value) {Node* current = *head;while (current != NULL) {if (current->data == value) {if (current->prev != NULL) {current->prev->next = current->next;} else {*head = current->next;}if (current->next != NULL) {current->next->prev = current->prev;}Node* toDelete = current;current = current->next;free(toDelete);} else {current = current->next;}}
}void printList(Node* head) {Node* temp = head;while (temp != NULL) {printf("%d\t", temp->data);temp = temp->next;}printf("\n");
}// 簡化的排序實現(實際應該用更高效的排序)
void sortList(Node** head) {if (*head == NULL || (*head)->next == NULL) return;int swapped;Node* ptr1;Node* lptr = NULL;do {swapped = 0;ptr1 = *head;while (ptr1->next != lptr) {if (ptr1->data > ptr1->next->data) {int temp = ptr1->data;ptr1->data = ptr1->next->data;ptr1->next->data = temp;swapped = 1;}ptr1 = ptr1->next;}lptr = ptr1;} while (swapped);
}int main() {Node* head = NULL;// 初始化三個節點insertBack(&head, 10);insertBack(&head, 20);insertBack(&head, 30);// 頭部插入5insertFront(&head, 5);// 尾部插入40insertBack(&head, 40);// 在位置2插入15insertAt(&head, 2, 15);printf("該列表的數為:");printList(head);// 刪除值為15的節點deleteValue(&head, 15);// 頭部插入99insertFront(&head, 99);// 排序sortList(&head);printf("該列表的數為:");printList(head);// 釋放內存(實際應用中需要完整實現)return 0;
}

C++與C實現的關鍵區別

特性C++?std::listC語言實現
內存管理自動管理(RAII)需手動malloc/free
類型安全模板實現,類型安全void*可能造成類型不安全
代碼復雜度簡潔,高級抽象冗長,需處理底層細節
功能完整性提供完整成員函數(sort, merge等)需自行實現所有功能
異常安全強異常安全保證無異常處理機制
迭代器提供標準迭代器需手動用指針遍歷
性能優化經過高度優化實現質量取決于程序員
可維護性接口穩定,文檔完善維護成本高
線程安全不同實例可并發訪問完全無線程安全保證
擴展性可輕松與其他STL組件配合需額外工作與其他模塊集成

關鍵差異詳解

1. 內存管理

  • C++:利用構造函數/析構函數自動管理內存

    {list<int> myList; // 自動初始化// ... 使用list ...
    } // 自動釋放所有內存
  • C:需手動分配和釋放

    Node* head = NULL; // 初始化
    // ... 使用鏈表 ...
    // 必須手動釋放所有節點
    while (head != NULL) {Node* temp = head;head = head->next;free(temp);
    }

2. 迭代器 vs 指針

  • C++迭代器

    for (auto it = myList.begin(); it != myList.end(); ++it) {cout << *it << " ";
    }
  • C指針遍歷

    Node* current = head;
    while (current != NULL) {printf("%d ", current->data);current = current->next;
    }

3. 高級操作

  • C++內置算法

    myList.sort();    // 內置排序
    myList.unique();  // 去重
    myList.merge(otherList); // 合并
  • C需手動實現

    sortList(&head);  // 自己實現的排序
    removeDuplicates(&head); // 自己實現的去重
    mergeLists(&head1, &head2); // 自己實現的合并

4. 類型安全

  • C++模板

    list<string> stringList; // 只能存儲字符串
    stringList.push_back(10); // 編譯錯誤
  • C無類型檢查

    typedef struct Node {void* data; // 無類型安全
    } Node;Node* node = (Node*)malloc(sizeof(Node));
    node->data = (void*)10; // 可能造成問題

為什么選擇C++ list?

  1. 開發效率:減少樣板代碼,專注業務邏輯

  2. 安全性:自動內存管理避免內存泄漏

  3. 可維護性:標準接口更易于理解和維護

  4. 性能:標準庫實現通常經過充分優化

  5. 可擴展性:與其他STL組件無縫協作

何時需要用C實現?

  1. 嵌入式系統等受限環境(無STL支持)

  2. 需要完全控制內存布局和分配策略

  3. 與現有C代碼庫集成

  4. 特殊性能需求(如自定義內存池)

現代C++改進(C++11/14/17)

  1. 初始化列表

    list<int> nums = {1, 2, 3}; // C++11
  2. 自動類型推導

    auto it = nums.begin(); // 不需要寫list<int>::iterator
  3. emplace操作

    nums.emplace_back(10); // 避免臨時對象構造
  4. 范圍for循環

    for (int num : nums) { ... } // 簡潔遍歷
  5. 結構化綁定(C++17)

    for (auto& [index, value] : enumerate(nums)) { ... }

理解這些差異有助于根據項目需求選擇合適的實現方式。對于大多數現代C++項目,std::list是更優的選擇,而在特定場景下可能需要考慮C實現。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/87986.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/87986.shtml
英文地址,請注明出處:http://en.pswp.cn/web/87986.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Spring CGLIB私有方法訪問成員變量為null問題

場景 代碼 RestController public class TestJob {Autowiredprivate XxService xxService;XxlJob("testCGLIB")private void doTest(){System.out.println("方法調用");System.out.println("成員變量注入:"(xxService!null));this.doInnerTest()…

Paimon本地表查詢引擎LocalTableQuery詳解

LocalTableQueryLocalTableQuery 是 Paimon 中實現本地化、帶緩存的表查詢的核心引擎。它的主要應用場景是 Flink 中的 Lookup Join。當 Flink 作業需要根據一個流中的 Key 去關聯一個 Paimon 維表時&#xff0c;LocalTableQuery 可以在 Flink 的 TaskManager 節點上&#xff0…

使用協程簡化異步資源獲取操作

異步編程的兩種場景 在異步編程中&#xff0c;回調函數通常服務于兩種不同場景&#xff1a; 一次性資源獲取&#xff1a;等待異步操作完成并返回結果。持續事件通知。監聽并響應多個狀態變更。 Kotlin為這兩種場景提供了解決方案&#xff1a;使用掛起函數簡化一次性資源獲取…

ABP VNext + Cosmos DB Change Feed:搭建實時數據變更流服務

ABP VNext Cosmos DB Change Feed&#xff1a;搭建實時數據變更流服務 &#x1f680; &#x1f4da; 目錄ABP VNext Cosmos DB Change Feed&#xff1a;搭建實時數據變更流服務 &#x1f680;TL;DR ?&#x1f680;1. 環境與依賴 &#x1f3d7;?2. 服務注冊與依賴注入 &…

STM32-定時器

定時器&#xff1a;有4個獨立通道&#xff1a;輸入捕獲&#xff1b;輸出比較PWM生成&#xff1b;單脈沖模式輸出&#xff1b;可通外部信號控制定時器&#xff08;TIMx-ETR&#xff09;&#xff1b;支持針對定時的增量&#xff08;正交&#xff09;編碼器、霍爾傳感器電路通用定…

Windows Server 2019--職業技能大賽B模塊Windows服務器配置樣題

一、賽題說明 &#xff08;一&#xff09;競賽介紹 請詳細閱讀網絡拓撲圖&#xff0c;為所有計算機修改默認防火墻以便允許ICMP和相應的流量&#xff0c;不允許直接關閉主機的防火墻。除了CD-ROM/HDD驅動器&#xff0c;請不要修改虛擬機本身的硬件設置。 &#xff08;二&…

vue3+Echarts實現立體柱狀圖

Echarts柱狀圖中文網&#xff1a;https://echarts.apache.org/examples/zh/index.html#chart-type-bar 效果展示&#xff1a; 主要實現過程是三部分的組合&#xff0c;最上面是一個橢圓&#xff0c;中間是正常的柱子&#xff0c;下方再加上一個橢圓&#xff0c;就出來立體的效…

【UE5】虛幻引擎小百科

一、類名前面的大寫字母的含義是什么UE5常見前綴分類表前綴含義實例用于AActorACharacter&#xff0c;AWeaponBase可放入世界中的對象&#xff08;有位置、可碰撞等&#xff09;UUObject派生類UUserWidget&#xff0c;UWeaponComponent引擎對象、邏輯模塊&#xff0c;不具備Tra…

【Linux系統】vim編輯器 | 編譯器gcc/g++ | make/Makefile

1. vim編輯器一、歷史發展與Vim vs Vi的區別起源與演進Vi&#xff08;1976年&#xff09; &#xff1a;由Bill Joy開發&#xff0c;嵌入BSD Unix系統&#xff0c;是首個面向屏幕的文本編輯器&#xff0c;但功能有限&#xff08;如無多級撤銷&#xff09;。Vim&#xff08;1991年…

國產飛騰主板,賦能網絡安全防御硬手段

? 當前&#xff0c;網絡安全形勢嚴峻&#xff0c;網絡攻擊手段不斷翻新&#xff0c;從數據泄露到電腦中毒&#xff0c;企業、機構乃至國家的數字資產都面臨著巨大風險。在此背景下&#xff0c;國產硬件技術的突破對筑牢網絡安全防線意義重大。 高能計算機基于市場需求&#…

Spring AI 概述與架構設計

目錄一、前言二、簡介三、核心能力概覽四、理解模塊架構圖五、模型適配能力六、最小應用示例七、與傳統 LLM 調用相比八、總結九、參考一、前言 在 AI 正以前所未有的速度“下沉”到各類系統與業務的當下&#xff0c;Spring 官方推出的 Spring AI 項目&#xff0c;為 Java 開發…

UI前端與數字孿生融合新領域:智慧環保的污染源監測與治理

hello寶子們...我們是艾斯視覺擅長ui設計、前端開發、數字孿生、大數據、三維建模、三維動畫10年經驗!希望我的分享能幫助到您!如需幫助可以評論關注私信我們一起探討!致敬感謝感恩!一、引言&#xff1a;數字孿生重構智慧環保的技術范式在環境污染治理壓力持續增大的背景下&…

【go/wails】wails入門系列(一)環境安裝與demo

文章目錄說在前面go安裝nodejs安裝wails創建項目運行說在前面 操作系統&#xff1a;win11go版本&#xff1a;1.24.4nodejs版本&#xff1a;v22.16.0wails版本&#xff1a;v2.10.1 go安裝 官網 這里 下載安裝即可 nodejs 官網 這里 下載安裝即可 安裝wails 設置go國內代理g…

linux qt 使用log4cpp庫

一、日志庫下載 下載地址&#xff1a;https://log4cpp.sourceforge.net/二、日志庫解壓&#xff0c;編譯 1.將文件夾解壓出來2.進入文件夾內部&#xff0c;打開終端3.終端中依次輸入以下命令 mkdir build ./configure --prefix$(pwd)/build make make install 一般來說不會報錯…

探索阿里云Data Integration:數據同步的魔法工具

引言在當今數字化時代&#xff0c;數據已成為企業的核心資產&#xff0c;如同企業發展的 “燃料”&#xff0c;驅動著業務的增長與創新。從用戶行為數據到業務運營數據&#xff0c;從市場趨勢數據到供應鏈數據&#xff0c;每一個數據點都蘊含著巨大的價值&#xff0c;能夠為企業…

【Java面試】Redis的poll函數epoll函數區別?

Redis 在選擇 poll 和 epoll 時主要基于性能需求、連接規模、操作系統支持等因素。以下是具體場景的對比與選擇建議&#xff1a;1. 何時使用 poll 函數&#xff1f;適用場景&#xff1a; 跨平臺兼容性需求&#xff1a;poll 在幾乎所有操作系統&#xff08;如 Windows、BSD、Lin…

RPC--RPCHandler的實現

在RPC框架中&#xff0c;Handler用于接收RpcRequest&#xff0c;經過處理后返回RpcResponseSlf4jpublic class RpcRequestHandler {private final ServiceProvider serviceProvider;//獲取一個單例模式的服務提供類public RpcRequestHandler() {serviceProvider SingletonFact…

C#讀取文件夾和文件列表:全面指南

C#讀取文件夾和文件列表&#xff1a;全面指南 在 C# 開發中&#xff0c;經常需要獲取文件夾中的文件列表或子文件夾結構&#xff0c;例如文件管理器、批量處理工具、備份程序等場景。本文將詳細介紹 C# 中讀取文件夾和文件列表的各種方法&#xff0c;包括基礎操作、遞歸遍歷、過…

從小白到進階:解鎖linux與c語言高級編程知識點嵌入式開發的任督二脈(1)

【硬核揭秘】Linux與C高級編程&#xff1a;從入門到精通&#xff0c;你的全棧之路&#xff01;第一部分&#xff1a;初識Linux與環境搭建&#xff0c;玩轉軟件包管理——嵌入式開發的第一道“坎”嘿&#xff0c;各位C語言的“卷王”們&#xff01;你可能已經習慣了在Windows或m…

.net開源庫SignalR

.NET開源庫SignalR&#xff1a;打造實時Web應用的利器 在當今的Web開發領域&#xff0c;實時性已經成為了許多應用的核心需求。無論是實時聊天、實時數據監控還是實時游戲&#xff0c;都需要服務器能夠及時地將數據推送給客戶端。而.NET開源庫SignalR&#xff0c;正是滿足這一…