c++ list的front和pop_front的概念和使用案例—第2版

embedded/2025/2/5 3:56:04/

在 C++ 标准库中,std::listfront()pop_front() 是与链表头部元素密切相关的两个成员函数。以下是它们的核心概念和具体使用案例:


1. front() 方法

概念:
  • 功能:返回链表中第一个元素的引用(直接访问头部元素)。
  • 时间复杂度:O(1)。
  • 注意事项
    • 若链表为空,调用 front() 会导致未定义行为(需先用 empty() 检查是否非空)。
    • 返回的是引用,可以直接修改链表中的元素。
使用案例:
#include <iostream>
#include <list>int main() {std::list<int> myList = {10, 20, 30};// 访问第一个元素std::cout << "Front element: " << myList.front() << std::endl; // 输出 10// 修改第一个元素myList.front() = 100;std::cout << "Modified front: " << myList.front() << std::endl; // 输出 100return 0;
}

2. pop_front() 方法

概念:
  • 功能移除链表中的第一个元素(直接删除头部元素)。
  • 时间复杂度:O(1)。
  • 注意事项
    • 若链表为空,调用 pop_front() 会导致未定义行为(需先检查 empty())。
    • 调用后,原头部元素被销毁,内存被释放。
使用案例:
#include <iostream>
#include <list>int main() {std::list<int> myList = {10, 20, 30};// 删除第一个元素myList.pop_front(); // 链表变为 {20, 30}// 遍历验证结果for (const auto& num : myList) {std::cout << num << " "; // 输出 20 30}return 0;
}

3. 综合应用场景

场景:队列的 FIFO 操作(先进先出)
#include <iostream>
#include <list>int main() {std::list<std::string> messageQueue;// 添加消息到队列尾部(push_back 模拟入队)messageQueue.push_back("Message 1");messageQueue.push_back("Message 2");// 处理队列中的第一条消息(front + pop_front 模拟出队)while (!messageQueue.empty()) {std::cout << "Processing: " << messageQueue.front() << std::endl;messageQueue.pop_front(); // 移除已处理的消息}return 0;
}

输出

Processing: Message 1
Processing: Message 2

4. 对比其他容器

容器front() + pop_front() 效率特点
std::listO(1)双向链表,适合频繁头尾操作
std::dequeO(1)双端队列,内存分块,随机访问快
std::vectorpop_front()头部删除需用 erase,效率 O(n)

5. 关键注意事项

  1. 空链表检查
    调用 front()pop_front() 前必须检查链表是否为空,否则会导致未定义行为:

    if (!myList.empty()) {myList.pop_front();
    }
    
  2. 迭代器失效
    pop_front() 会使指向被删除元素的迭代器、引用和指针失效,但其他元素不受影响。

  3. push_front() 配合
    常用于实现栈(LIFO)或队列(FIFO)结构:

    std::list<int> stack;
    stack.push_front(1);  // 压栈
    stack.pop_front();    // 弹栈
    

总结

方法用途效率适用场景
front()访问头部元素O(1)需要读取或修改头部元素
pop_front()删除头部元素O(1)高效移除头部元素

使用建议

  • 若需要频繁在链表头部插入/删除元素,std::list 是最优选择。
  • 若需兼顾随机访问和头部操作,可考虑 std::deque

http://www.ppmy.cn/embedded/159651.html

相关文章

257. 二叉树的所有路径

二叉树的所有路径 已解答 简单 给你一个二叉树的根节点 root &#xff0c;按 任意顺序 &#xff0c;返回所有从根节点到叶子节点的路径。 叶子节点 是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [1,2,3,null,5] 输出&#xff1a;[“1->2->5”,“…

HTB:UnderPass[WriteUP]

目录 连接至HTB服务器并启动靶机 信息收集 使用rustscan对靶机TCP端口进行开放扫描 使用nmap对靶机TCP开放端口进行脚本、服务扫描 使用nmap对靶机TCP开放端口进行漏洞、系统扫描 使用nmap对靶机常用UDP端口进行开放扫描 使用nmap对靶机UDP开放端口进行脚本、服务扫描 …

Python玄学

过年期间无聊的看了看DY直播&#xff0c;也是迷上玄学了。突然想着为啥要自己掐指算&#xff0c;我这&#x1f437;脑哪记得到那么多东西啊。然后&#xff0c;就捣鼓捣鼓了一些玩意儿。留个纪念。 注&#xff1a;就是一个玄学推动学习&#xff0c;部分内容不必当真&#xff0c;…

三傻排序的比较(选择,冒泡,插入)

在学习排序算法时&#xff0c;选择排序、冒泡排序和插入排序是最常见的基础排序算法。但是&#xff0c;尽管这些算法看起来非常相似&#xff0c;它们在实际应用中的效率和性能却有所不同。本文将详细比较这三种排序算法的时间复杂度、空间复杂度。 比较总结 排序算法时间复杂…

如何在5步内使用 Spring AI 和 OpenAI 的 DALL-E 3 生成图像

将 Spring AI 与 OpenAI 的 DALL-E 3 集成&#xff0c;以生成图像。轻松设置 Spring Boot、配置 API 集成并自定义设置。 大家好&#xff01;这是关于 Spring AI 系列介绍文章的第一篇。今天&#xff0c;我们将了解如何通过文本提示轻松生成图片。为此&#xff0c;我们将利用 …

Go优雅实现redis分布式锁

前言 系统为了保证高可用&#xff0c;通常会部署多实例&#xff0c;并且会存在同时对共享资源并发读写&#xff0c;这时候为了保证读写的安全&#xff0c;常规手段是会引入分布式锁&#xff0c;本文将介绍如何使用redis设计一个优雅的Go分布式锁。 设计 redis分布式锁是借助…

Golang —协程池(panjf2000/ants/v2)

Golang —协程池&#xff08;panjf2000/ants/v2&#xff09; 1 ants1.1 基本信息1.2 ants 是如何运行的&#xff08;流程图&#xff09; 1 ants 1.1 基本信息 代码地址&#xff1a;github.com/panjf2000/ants/v2 介绍&#xff1a;ants是一个高性能的 goroutine 池&#xff0c…

YOLOV11-1:YoloV11-安装和CLI方式训练模型

YoloV11-安装和CLI方式训练模型 1.安装和运行1.1安装的基础环境1.2安装yolo相关组件1.3命令行方式使用1.3.1 训练1.3.2 预测 本文介绍yoloV11的安装和命令行接口 1.安装和运行 1.1安装的基础环境 GPU环境&#xff0c;其中CUDA是12.4版本 1.2安装yolo相关组件 # 克隆github…