c++ std::list使用笔记

news/2025/2/23 3:30:13/

c++ std::list使用笔记

      • 1. 包含头文件
      • 2. 创建和初始化 `std::list`
      • 3. 添加元素
      • 4. 删除元素
      • 5. 访问元素
      • 6. 遍历 `std::list`
      • 7. 容量相关操作
      • 8. 其他常用操作
      • 9. 示例代码
      • 总结

std::list 是 C++ 标准库中的一个双向链表容器。与 std::vector 不同, std::list 不支持随机访问,但它在任意位置插入和删除元素的操作效率更高(时间复杂度为 O(1))。以下是 std::list 的简单使用方法和常见操作。


1. 包含头文件

使用 std::list 需要包含头文件 <list>

#include <list>
#include <iostream>

list_15">2. 创建和初始化 std::list

  • 默认构造函数:创建一个空的 list
  • 初始化列表:用花括号 {} 初始化。
  • 拷贝构造函数:从另一个 list 拷贝。
std::list<int> list1;                // 空列表
std::list<int> list2 = {1, 2, 3};    // 初始化列表: [1, 2, 3]
std::list<int> list3(list2);         // 拷贝构造: list3 = [1, 2, 3]

3. 添加元素

  • push_back(value):在链表末尾添加元素。
  • push_front(value):在链表开头添加元素。
  • insert(iterator pos, value):在指定位置插入元素。
std::list<int> myList = {1, 2, 3};
myList.push_back(4);       // myList: [1, 2, 3, 4]
myList.push_front(0);      // myList: [0, 1, 2, 3, 4]
myList.insert(++myList.begin(), 10);  // myList: [0, 10, 1, 2, 3, 4]

4. 删除元素

  • pop_back():删除链表末尾的元素。
  • pop_front():删除链表开头的元素。
  • erase(iterator pos):删除指定位置的元素。
  • erase(iterator first, iterator last):删除范围 [first, last) 内的元素。
  • clear():清空链表。
std::list<int> myList = {1, 2, 3, 4, 5};
myList.pop_back();         // myList: [1, 2, 3, 4]
myList.pop_front();        // myList: [2, 3, 4]
myList.erase(++myList.begin());  // myList: [2, 4]
myList.clear();            // myList: []

5. 访问元素

  • front():返回链表第一个元素。
  • back():返回链表最后一个元素。

注意std::list 不支持随机访问(如 operator[]at()),因为它是链表结构。

std::list<int> myList = {1, 2, 3};
std::cout << "Front: " << myList.front() << std::endl;  // 输出: Front: 1
std::cout << "Back: " << myList.back() << std::endl;    // 输出: Back: 3

list_77">6. 遍历 std::list

  • 范围 for 循环

    std::list<int> myList = {1, 2, 3};
    for (int val : myList) {std::cout << val << " ";  // 输出: 1 2 3
    }
    
  • 迭代器

    std::list<int> myList = {1, 2, 3};
    for (auto it = myList.begin(); it != myList.end(); ++it) {std::cout << *it << " ";  // 输出: 1 2 3
    }
    

7. 容量相关操作

  • size():返回链表中元素的数量。
  • empty():判断链表是否为空。
  • max_size():返回链表可以容纳的最大元素数量。
std::list<int> myList = {1, 2, 3};
std::cout << "Size: " << myList.size() << std::endl;  // 输出: Size: 3
std::cout << "Empty: " << myList.empty() << std::endl;  // 输出: Empty: 0 (false)
std::cout << "Max size: " << myList.max_size() << std::endl;

8. 其他常用操作

  • sort():对链表进行排序。
  • reverse():反转链表。
  • merge(list& other):合并两个有序链表。
  • unique():删除连续重复的元素。
std::list<int> list1 = {3, 1, 2};
std::list<int> list2 = {5, 4};list1.sort();           // list1: [1, 2, 3]
list2.sort();           // list2: [4, 5]
list1.merge(list2);     // list1: [1, 2, 3, 4, 5], list2: []
list1.reverse();        // list1: [5, 4, 3, 2, 1]
list1.unique();         // 如果链表中有连续重复元素,会删除重复项

9. 示例代码

#include <iostream>
#include <list>int main() {std::list<int> myList = {1, 2, 3};// 添加元素myList.push_back(4);myList.push_front(0);// 遍历std::cout << "List: ";for (int val : myList) {std::cout << val << " ";  // 输出: 0 1 2 3 4}std::cout << std::endl;// 删除元素myList.pop_back();myList.pop_front();// 访问元素std::cout << "Front: " << myList.front() << std::endl;  // 输出: Front: 1std::cout << "Back: " << myList.back() << std::endl;    // 输出: Back: 3// 排序和反转myList.sort();myList.reverse();std::cout << "After sort and reverse: ";for (int val : myList) {std::cout << val << " ";  // 输出: 3 2 1}std::cout << std::endl;return 0;
}

总结

std::list 是一个双向链表,适合频繁在任意位置插入和删除元素的场景。它的主要特点是:

  • 插入和删除操作的时间复杂度为 O(1)。
  • 不支持随机访问,只能通过迭代器遍历。
  • 提供了排序、反转、合并等操作。

根据需求选择合适的容器(如 std::vectorstd::list)可以显著提高程序性能。


http://www.ppmy.cn/news/1574320.html

相关文章

go 网络编程 websocket gorilla/websocket

在 Go 语言中&#xff0c;你可以使用标准库中的 net/http 包和第三方库 gorilla/websocket 来实现一个 WebSocket 服务器。gorilla/websocket 库提供了对 WebSocket 协议的高级抽象&#xff0c;使得处理 WebSocket 连接变得相对简单。 package mainimport ("fmt"&qu…

科普:你的笔记本电脑中有三个IP:127.0.0.1、无线网 IP 和局域网 IP;两个域名:localhost和host.docker.internal

三个IP 你的笔记本电脑中有三个IP&#xff1a;127.0.0.1、无线网 IP 和局域网 IP。 在不同的场景下&#xff0c;需要选用不同的 IP 地址&#xff0c;如下为各自的特点及适用场景&#xff1a; 127.0.0.1&#xff08;回环地址&#xff09; 特点 127.0.0.1 是一个特殊的 IP 地…

Docker 替换到 Containerd (nerdctl相关指令)

因为docker不给用了,所以使用Containerd来代替 前置准备 安装 Containerd # 安装 containerd yum install -y yum-utils yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo yum install -y containerd.io # 生成默认配置文件 mkdir -p…

Docker-技术架构演进之路

目录 一、概述 常见概念 二、架构演进 1.单机架构 2.应用数据分离架构 3.应用服务集群架构 4.读写分离 / 主从分离架构 5.引入缓存 —— 冷热分离架构 6.垂直分库 7.业务拆分 —— 微服务 8.容器化引入——容器编排架构 三、尾声 一、概述 在进行技术学习过程中&am…

基于Spring Boot的农产品智慧物流系统设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

游戏开发微信小程序--工具箱之父

小程序工具箱之父已更新 Page({data: {score: 0,lives: 3,gameOver: false,playerVisible: true,level: 1,petType: cat,speedBuff: 1,coins: 0,friends: [],achievements: [],currentPetFrame: 0, // 当前宠物动画帧scoreMultiplier: 1, // 得分倍率gameSpeed: 1, // …

趣丸多云架构的演进与实践:从单云到多云2.0的旅程

随着数字化转型的加速&#xff0c;云计算已经成为企业IT架构的核心组成部分。在这个过程中&#xff0c;趣丸科技凭借其前瞻性的战略眼光和技术实力&#xff0c;成功实现了从单云架构到多云2.0的演进。本文将深入探讨这一旅程中的关键步骤、所面临的挑战以及趣丸科技的解决方案。…

计算机视觉基础|卷积神经网络:从数学原理到可视化实战

一、引言 在当今人工智能飞速发展的时代&#xff0c;卷积神经网络&#xff08;Convolutional Neural Network&#xff0c;简称 CNN&#xff09;无疑在诸多领域发挥着关键作用&#xff0c;尤其在计算机视觉领域&#xff0c;如人脸识别、图像分类、目标检测等任务中&#xff0c;…