C++ list

ops/2025/2/1 15:18:56/

list需知:

list不会出现insert迭代器失效问题

链表插入不会影响原有数据相对位置,且不用扩容

但是erase会导致相对数据位置移动,所有其erase会导致迭代器失效
list排序效率很低 不建议使用 小规模数据量可以使用,比较方便

此外我们不能使用迭代器的时候不能用it<c.end

因为end是最后一个元素的后面的位置

此外链表的地址的大小是乱的

merge函数

 std::list  的  merge()  函数用于合并两个已排序的列表。此函数将所有元素从另一个列表移动到当前列表,并保持元素的排序。

使用比较器
如果你需要根据自定义的排序规则合并列表,可以使用第二个重载版本的  merge()  函数,该版本接受一个比较器参数:bool mycomparison(float a, float b) {
    return a < b; // 自定义比较规则
}

// 使用比较器合并
first.merge(second, mycomparison);注意事项

在合并之前,确保列表已经正确排序,否则结果可能不符合预期。
 merge()  函数假设两个列表使用相同的排序规则。如果规则不同,需要使用带比较器的版本。
 merge()  不会像某些其他标准库算法那样检查排序条件,它假定列表已经是排序的。

通过这些信息,你可以有效地使用  std::list  的  merge()  函数来处理已排序的列表合并。

unique函数

 

 std::unique  是 C++ 标准库中的一个算法,用于去除容器中相邻的重复元素。

 std::unique  函数需要两个参数,分别是容器的开始和结束迭代器。它会将所有相邻的重复元素移动到容器的末尾,并返回一个指向新结束位置的迭代器。
通常,在调用  std::unique  之前,容器中的元素应先排序,因为  std::unique  只能去除相邻的重复元素。
删除多余的元素 :

虽然  std::unique  不会改变容器的大小,但它会将重复的元素移至容器末尾。可以通过调用  std::list::erase  来删除这些重复的元素。

通过调用  sort()  方法对列表进行排序,然后使用  std::unique  处理重复的相邻元素,并通过  erase()  方法删除这些重复元素。最终,输出的是一个不包含相邻重复元素的列表。

 remove函数

remove相当于find+erase如果没找到 remove什么都不会做

splice函数

 (1)全部转移

 (2)转移某一个

 (3)转移某一部分

 splice 函数是C++标准模板库(STL)中的 list 容器的一个功能强大的方法,它允许将元素从一个列表移动到另一个列表,而不需要创建新元素,从而优化性能。 splice 函数有三种不同的重载方式:

移动整个列表 :void splice(iterator position, list& x);这个版本的 splice 会将列表 x 中的所有元素移动到列表 position 所指向的位置。列表 x 在操作后将变为空。

移动单个元素 :void splice(iterator position, list& x, iterator i);此版本的 splice 仅将列表 x 中由迭代器 i 指向的单个元素移动到 position 所指向的位置。

移动元素范围 :void splice(iterator position, list& x, iterator first, iterator last);这个版本的 splice 会将列表 x 中由迭代器 first 和 last 定义的范围内的元素移动到 position 所指向的位置。这个范围包括 first 指向的元素,但不包括 last 指向的元素。

这个操作不仅简单而且效率高,因为它避免了元素的复制,只是改变了元素在内存中的链接。

operator->函数

我们在自己写operator->的时候要注意 

operator->的使用场景

struct A
{A(int a1 = 0, int a2 = 0):_a1(a1), _a2(a2){}int _a1;int _a2;
};
void test_list2()
{list<A> lt;lt.push_back(A(1, 1));lt.push_back(A(2, 2));lt.push_back(A(3, 3));lt.push_back(A(4, 4));list<A>::iterator it = lt.begin();while (it != lt.end()){cout << (*it)._a1 << " " << (*it)._a2 << endl;cout << it->_a1 << " " << it->_a2 << endl;++it;}cout << endl;
}

传统写法与现代写法 

 

 我们在实现list的时候 发现我们在实现函数写返回值和参数的时候既然可以用类名 也可以用类型

但是更推荐用类型也就是下面这种 虽然效率没有提示 但是可读性更高!


http://www.ppmy.cn/ops/154780.html

相关文章

Github 2025-01-31Java开源项目日报 Top10

根据Github Trendings的统计,今日(2025-01-31统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Java项目10C项目1Kotlin项目1Bazel:快速、可扩展的多语言构建系统 创建周期:3564 天开发语言:Java协议类型:Apache License 2.0Star数量:2…

字符串,集合

String 概述 java.lang.String 类代表字符串&#xff0c;Java 程序中的所有字符串文字(例如“abc”)都为此类的对象 注意&#xff1a;字符串的内容是不会发生改变的&#xff0c;它的对象在创建后不能被更改 String是Java定义好的一个类。定义在java.lang 包中&#xff0c;所…

DDD - 领域驱动设计分层架构:构建可演化的微服务架构

文章目录 引言1. 什么是DDD分层架构&#xff1f;1.1 DDD分层架构的演变1.2 四层架构的起源与问题1.3 依赖倒置和五层架构 2. DDD分层架构的核心层次2.1 用户接口层&#xff08;User Interface Layer&#xff09;2.2 应用层&#xff08;Application Layer&#xff09;2.3 领域层…

kafka消费者详细介绍(超级详细)

文章目录 一、Kafka 消费者与消费者组1.1 Kafka 消费者&#xff08;Consumer&#xff09;概述1.1.1 消费者工作流程1.1.2 消费者的关键配置 1.2 Kafka 消费者组&#xff08;Consumer Group&#xff09;概述1.2.1 消费者组的工作原理1.2.2 消费者组的优点1.2.3 消费者组的再均衡…

Linux网络编程中的零拷贝:提升性能的秘密武器

在当今数字化时代&#xff0c;网络应用的性能至关重要。而在网络编程中&#xff0c;数据传输的效率直接影响着应用的整体性能。传统的数据传输方式往往涉及大量的数据拷贝和上下文切换&#xff0c;这在高并发、大数据量的场景下&#xff0c;会成为性能瓶颈。零拷贝技术的出现&a…

25.Word:学生成绩管理系统【8】

目录 NO1.2​ NO3 NO4.5.6 NO7.8.9​​ NO1.2 F12另存为→考生文件夹布局→页面设置对话框→纸张大小→页边距&#xff1a;上下左右→文档网格&#xff1a; NO3 布局→分隔符→分节符&#xff1a;下一页&#xff08;封面、目录、一、二、三、四&#xff09;6节双击页眉页…

Kotlin开发(六):Kotlin 数据类,密封类与枚举类

引言 想象一下&#xff0c;你是个 Kotlin 开发者&#xff0c;敲着代码忽然发现业务代码中需要一堆冗长的 POJO 类来传递数据。烦得很&#xff1f;别急&#xff0c;Kotlin 贴心的 数据类 能帮你自动生成 equals、hashCode&#xff0c;直接省时省力&#xff01;再想想需要多种状…

React第二十八章(css modules)

css modules 什么是 css modules 因为 React 没有Vue的Scoped&#xff0c;但是React又是SPA(单页面应用)&#xff0c;所以需要一种方式来解决css的样式冲突问题&#xff0c;也就是把每个组件的样式做成单独的作用域&#xff0c;实现样式隔离&#xff0c;而css modules就是一种…