C++ STL(三)list

目录

list是什么

构造函数

元素访问

容量操作

修改

迭代器

code实例

实现简单的list

forward_list是什么

构造函数

元素访问

容量

修改

迭代器

code实例

实现一个简单的forward_list


list是什么

std::list 是 C++ 标准模板库(STL)中的一个双向链表容器。它支持在任意位置高效地插入和删除元素,但随机访问性能较差。底层结构数据域:存储元素的值。前驱指针:指向前一个节点。   后继指针:指向后一个节点。优点:在任意位置插入和删除元素的时间复杂度为 O(1)。不需要连续内存,适合频繁插入和删除的场景。缺点:随机访问的时间复杂度为 O(n)。内存开销较大,因为每个节点需要额外存储两个指针。

struct ListNode {T value;          // 数据域ListNode* prev;   // 前驱指针ListNode* next;   // 后继指针
};

构造函数

list()默认构造函数,创建一个空的 list
list(size_type count)创建包含 count 个默认初始化元素的 list。
list(size_type count, const T& value)创建包含 count 个值为 value 的元素的 list
list(const list& other)拷贝构造函数
list(initializer_list<T> init)使用初始化列表创建 list

元素访问

front(): 返回第一个元素的引用。back(): 返回最后一个元素的引用。

容量操作

empty(): 检查否为空。size(): 返回 list 中的元素数量。max_size(): 返回 list 可以容纳的最大元素数量。

修改

clear(): 清除 list 中的所有元素erase(iterator pos): 删除指定位置 pos 处的元素
pop_back(): 删除 list 的最后一个元素pop_front(): 删除 list 的第一个元素
swap(list& other): 交换两个 list 的内容resize(size_type count): 改变 list 的大小为 count
insert(iterator pos, const T& value): 在指定位置 pos 插入元素 value
push_back(const T& value): 在 list 的末尾添加元素 value
push_front(const T& value): 在 list 的开头添加元素 value

迭代器

begin(), end(): 返回指向第一个元素和最后一个元素之后位置的迭代器
rbegin(), rend(): 返回反向迭代器
cbegin(), cend(), crbegin(), crend(): 返回常量迭代器

std::list 的迭代器是一个双向迭代器,支持 ++ 和 -- 操作。迭代器的实现通常是对链表节点的封装,erase:删除元素时,指向被删除元素的迭代器失效。insert:插入元素不会使其他迭代器失效。push_back 和 push_front:也不会使其他迭代器失效。

code实例

#include <list>
#include <iostream>int main() {//构造函数std::list<int> l1; // 空 liststd::list<int> l2(5); // 包含 5 个默认初始化元素的 liststd::list<int> l3(5, 10); // 包含 5 个值为 10 的元素的 liststd::list<int> l = {1, 2, 3, 4, 5}; // 使用初始化列表创建 list//元素访问std::cout << "l.front(): " << l.front() << std::endl; // 输出: 1std::cout << "l.back(): " << l.back() << std::endl;   // 输出: 5//容量std::cout << "l.empty(): " << l.empty() << std::endl; // 输出: 0 (false)std::cout << "l.size(): " << l.size() << std::endl;   // 输出: 5std::cout << "l.max_size(): " << l.max_size() << std::endl; // 输出: 一个很大的数std::cout << std::endl;//修改l.push_back(6); // l: {1, 2, 3, 4, 5, 6}l.push_front(0); // l: {0, 1, 2, 3, 4, 5, 6}l.pop_back(); // l: {0, 1, 2, 3, 4, 5}l.pop_front(); // l: {1, 2, 3, 4, 5}l.insert(std::next(l.begin(), 2), 10); // l: {1, 2, 10, 3, 4, 5}l.erase(std::next(l.begin(), 3)); // l: {1, 2, 10, 4, 5}for (int i : l) {std::cout << i << " "; // 输出: 1 2 10 4 5}//迭代器std::cout << "l: ";for (auto it = l.begin(); it != l.end(); ++it) {std::cout << *it << " "; // 输出: 1 2 10 4 5}std::cout << std::endl;std::cout << "l (reverse): ";for (auto it = l.rbegin(); it != l.rend(); ++it) {std::cout << *it << " "; // 输出: 5 4 10 2 1}return 0;
}

实现简单的list

#include <iostream>template <typename T>
class SimpleList {
private:struct Node {T value;Node* prev;Node* next;Node(const T& val) : value(val), prev(nullptr), next(nullptr) {}};Node* head;Node* tail;size_t size;public:SimpleList() : head(nullptr), tail(nullptr), size(0) {}~SimpleList() {while (head) {Node* temp = head;head = head->next;delete temp;}}void push_back(const T& value) {Node* newNode = new Node(value);if (!tail) {head = tail = newNode;} else {tail->next = newNode;newNode->prev = tail;tail = newNode;}size++;}void print() const {Node* current = head;while (current) {std::cout << current->value << " ";current = current->next;}std::cout << std::endl;}
};int main() {SimpleList<int> list;list.push_back(1);list.push_back(2);list.push_back(3);list.print(); // 输出: 1 2 3return 0;
}

forward_list是什么

std::forward_list 是 C++ 标准模板库(STL)中的一个单向链表容器。它支持在链表头部高效地插入和删除元素,但不支持反向遍历。每个节点包含:数据域:存储元素的值。后继指针:指向下一个节点。在链表头部插入和删除元素的时间复杂度为 O(1)。内存开销比 std::list 更小,因为每个节点只需要一个指针。随机访问的时间复杂度为 O(n)

struct ForwardListNode {T value;          // 数据域ForwardListNode* next; // 后继指针
};

构造函数

forward_list()默认构造函数,创建一个空的 forward_list
forward_list(size_type count)创建包含 count 个默认初始化元素的 forward_list
forward_list(size_type count, const T& value)创建包含 count 个值为 value 的元素的 forward_list
forward_list(const forward_list& other)拷贝构造函数
forward_list(initializer_list<T> init)使用初始化列表创建 forward_list

元素访问

front(): 返回第一个元素的引用

容量

empty(): 检查 forward_list 是否为空。max_size(): 返回 forward_list 可以容纳的最大元素数量

修改

clear(): 清除 forward_list 中的所有元素pop_front(): 删除 forward_list 的第一个元素
erase_after(iterator pos): 删除指定位置pos之后的元素swap(forward_list& other): 交换两个链表的内容

insert_after(iterator pos, const T& value): 在指定位置 pos 之后插入元素 value

push_front(const T& value): 在 forward_list 的开头添加元素 value
resize(size_type count): 改变 forward_list 的大小为 count

迭代器

before_begin(): 返回指向第一个元素之前位置的迭代器
begin(), end(): 返回指向第一个元素和最后一个元素之后位置的迭代器
cbefore_begin(), cbegin(), cend(): 返回常量迭代器

std::forward_list 的迭代器是一个前向迭代器,仅支持 ++ 操作。迭代器的实现通常是对链表节点的封装。erase_after:删除元素时,指向被删除元素的迭代器失效。insert_after/push_front:不会使其他迭代器失效。

code实例

#include <forward_list>
#include <iostream>int main() {//构造函数std::forward_list<int> fl1; // 空 forward_liststd::forward_list<int> fl2(5); // 包含 5 个默认初始化元素的 forward_liststd::forward_list<int> fl3(5, 10); // 包含 5 个值为 10 的元素的 forward_liststd::forward_list<int> fl = {1, 2, 3, 4, 5}; // 使用初始化列表创建 forward_list//元素访问std::cout << "fl.front(): " << fl.front() << std::endl; // 输出: 1//容量操作std::cout << "fl.empty(): " << fl.empty() << std::endl; // 输出: 0 (false)std::cout << "fl.max_size(): " << fl.max_size() << std::endl; // 输出: 一个很大的数//修改fl.push_front(0); // fl: {0, 1, 2, 3, 4, 5}fl.pop_front(); // fl: {1, 2, 3, 4, 5}fl.insert_after(fl.before_begin(), 10); // fl: {10, 1, 2, 3, 4, 5}fl.erase_after(fl.before_begin()); // fl: {1, 2, 3, 4, 5}for (auto it = fl.begin(); it != fl.end(); ++it) {std::cout << *it << " "; // 输出: 1 2 3 4 5}return 0;
}

实现一个简单的forward_list

#include <iostream>template <typename T>
class SimpleForwardList {
private:struct Node {T value;Node* next;Node(const T& val) : value(val), next(nullptr) {}};Node* head;size_t size;public:SimpleForwardList() : head(nullptr), size(0) {}~SimpleForwardList() {while (head) {Node* temp = head;head = head->next;delete temp;}}void push_front(const T& value) {Node* newNode = new Node(value);newNode->next = head;head = newNode;size++;}void print() const {Node* current = head;while (current) {std::cout << current->value << " ";current = current->next;}std::cout << std::endl;}
};int main() {SimpleForwardList<int> fl;fl.push_front(1);fl.push_front(2);fl.push_front(3);fl.print(); // 输出: 3 2 1return 0;
}

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

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

相关文章

【Maui】系统找不到指定的文件Xamarin.Android.Aapt2.targets

文章目录 前言一、问题描述二、解决方案三、软件开发&#xff08;源码&#xff09;四、项目展示 前言 .NET 多平台应用 UI (.NET MAUI) 是一个跨平台框架&#xff0c;用于使用 C# 和 XAML 创建本机移动和桌面应用。 使用 .NET MAUI&#xff0c;可从单个共享代码库开发可在 And…

sql server 复制从备份初始化数据

参考 &#xff1a; 从备份初始化订阅&#xff08;事务&#xff09; - SQL Server | Microsoft Learn sql server 复制默认是用快照初始化数据的&#xff0c;也支持从备份初始化数据&#xff0c;参考如上

GDidees CMS v3.9.1本地文件泄露漏洞(CVE-2023-27179)

漏洞简介&#xff1a; GDidees CMS v3.9.1及更低版本被发现存在本地文件泄露漏洞&#xff0c;漏洞通过位于 /_admin/imgdownload.php 的 filename 参数进行利用。 漏洞环境&#xff1a; 春秋云镜中的漏洞靶标&#xff0c;CVE编号为CVE-2023-27179 漏洞复现: 进入靶场发现没…

Redis面试题----MySQL 里有 2000w 数据,Redis 中只存 20w 的数据,如何保证 Redis 中的数据都是热点数据?

要保证 Redis 中存储的 20w 数据都是热点数据&#xff0c;可以从数据筛选和数据淘汰两个大的方面来考虑&#xff0c;以下是详细的实现思路和方法&#xff1a; 数据筛选 1. 基于业务规则 分析业务场景&#xff1a;不同的业务场景有不同的热点数据特征。例如&#xff0c;在电商…

【问题记录】Go项目Docker中的consul访问主机8080端口被拒绝

【问题记录】Go项目Docker中的consul访问主机8080端口被拒绝 问题展示解决办法 问题展示 在使用docker中的consul服务的时候&#xff0c;通过命令行注册相应的服务&#xff08;比如cloudwego项目的demo_proto以及user服务&#xff09;失败。 解决办法 经过分析&#xff0c;是…

【第十节】C++设计模式(结构型模式)-Flyweight( 享元)模式

目录 一、问题背景 二、模式选择 三、代码实现 四、总结讨论 一、问题背景 享元模式&#xff08;Flyweight Pattern&#xff09;在对象存储优化中的应用 在面向对象系统的设计与实现中&#xff0c;创建对象是最常见的操作之一。然而&#xff0c;如果一个应用程序使用了过多…

spring boot 2.7 + seata +微服务 降级失败问题修复

文章引流 一个简单而使用的API管理工具 版本号 spring boot 2.7.17 spring-cloud-dependencies 2021.0.8 spring-cloud-circuitbreaker-resilience4j 2.1.7 spring-cloud-starter-alibaba-seata 2021.1 jdk 1.8原因分析 未配置属性 feign.circuitbreaker.enabledtrue # 未…

实现实时数据仓库开源项目

根据你的需求&#xff0c;以下是一些可以实现类似 ClickHouse 的实时数仓功能的项目&#xff0c;这些项目提供了高性能的数据处理和分析能力&#xff0c;适合实时数据仓库的场景&#xff1a; 1. Apache Doris Apache Doris 是一个开源的实时数据仓库&#xff0c;支持高吞吐量…

【字符串】最长公共前缀 最长回文子串

文章目录 14. 最长公共前缀解题思路&#xff1a;模拟5. 最长回文子串解题思路一&#xff1a;动态规划解题思路二&#xff1a;中心扩散法 14. 最长公共前缀 14. 最长公共前缀 ​ 编写一个函数来查找字符串数组中的最长公共前缀。 ​ 如果不存在公共前缀&#xff0c;返回空字符…

Maven的传递性、排除依赖、生命周期、插件

一、Maven的传递性 蓝色背景中的两个jar包是projectA的直接依赖&#xff0c;其余的Jar包是projectA的间接依赖。 projectA可以使用直接依赖&#xff0c;也可以使用间接依赖。 maven-projectB项目引入了maven-projectC(整个项目打成了jar包&#xff09;和junit两个jar包。 ma…

API,URL,Token,XML,JSON是干嘛的

API&#xff0c;URL&#xff0c;Token&#xff0c;XML&#xff0c;JSON是干嘛的 API的作用 API&#xff08;Application Programming Interface&#xff0c;应用程序编程接口&#xff09;是一组定义和协议&#xff0c;用于构建和交互软件应用程序。API允许不同的软件系统之间…

Spring Boot操作MaxComputer(保姆级教程)

目录 引言 一、引入依赖 二、配置文件 application.properties&#xff08;信息用自己的奥&#xff09; 三、实体类User.java 四、UserController 五、UserService 六、UserDao 七、UserDao.xml 八、postman 访问&#xff0c;成功查询数据 附件(修改和删除数据) 引言…

Java【网络原理】(2)初识网络续与网络编程

目录 1.前言 2.正文 2.1TCP协议与UDP协议 2.2socket API进行网络编程 2.2.1DatagramPacket类 2.2.1.1发送数据报 2.2.1.2接收数据报 2.2.1.3获取数据报内容 2.2.1.4设置数据报内容 2.2.2DatagramSocket类 2.2.2.1构造方法 2.2.2.2常用方法 2.2.3具体代码与解释 3…

【Oracle专栏】sqlplus显示设置+脚本常用显示命令

Oracle相关文档&#xff0c;希望互相学习&#xff0c;共同进步 风123456789&#xff5e;-CSDN博客 1.内容概述 本文主要针对oracle 运维中常用知识点进行整理&#xff0c;包括&#xff1a; 1&#xff09;sqlplus模式下&#xff0c;为了方便查询设置相应的行宽、列宽、行数。…

在一台win10专业版设备上使用docker的怪现象

这台设备上&#xff0c;wsl环境无法直接安装docker&#xff0c;必须要在宿主机安装Docker Desktop.然后&#xff0c;在wsl运行前&#xff0c;要先启动docker desktop&#xff0c;否则&#xff0c;你看不到你自己创建的映像。 然后如果没有docker desktop加持&#xff0c;你在尝…

Unity 中Sirenix.OdinInspector 插件常用功能梳理

案例一 public class PracticeAssets : ScriptableObject {[SerializeField][Searchable][ListDrawerSettings(ShowIndexLabels true)][LabelText("练习版数据列表")]public List<PracticeData> Practicies new List<PracticeData>(); } 1. Serialize…

C++ | 面向对象 | 类

&#x1f47b;类 &#x1f47e;语法格式 class className{Access specifiers: // 访问权限DataType variable; // 变量returnType functions() { } // 方法 };&#x1f47e;访问权限 class className {public:// 公有成员protected:// 受保护成员private:// 私有成员 }…

从零开始用react + tailwindcss + express + mongodb实现一个聊天程序(五) 实现登录功能

1.登录页面 完善登录页面 和注册差不多 直接copy signUpPage 内容 再稍微修改下 import { useState } from "react"; import { useAuthStore } from "../store/useAuthStore"; import { MessageSquare,Mail,Lock,Eye, EyeOff,Loader2} from "lucide…

Spring Boot电影评论网站系统设计与实现

随着互联网和娱乐产业的发展&#xff0c;电影评论网站逐渐成为人们分享观影体验、交流影评的重要平台。本文将介绍一个基于Spring Boot框架开发的电影评论网站系统的功能设计与实现方案。 功能模块概述 该电影评论网站系统分为管理员模块和用户模块两大核心部分&#xff0c;以…

XFeat:轻量级的深度学习图像特征匹配

一、引言&#xff1a;图像特征匹配的挑战与XFeat的突破 在计算机视觉领域&#xff0c;图像特征匹配是视觉定位&#xff08;Visual Localization&#xff09;、三维重建&#xff08;3D Reconstruction&#xff09;、增强现实&#xff08;AR&#xff09;等任务的核心基础。传统方…