C++ Primer 特定容器算法

欢迎阅读我的 【C++Primer】专栏

专栏简介:本专栏主要面向C++初学者,解释C++的一些基本概念和基础语言特性,涉及C++标准库的用法,面向对象特性,泛型特性高级用法。通过使用标准库中定义的抽象设施,使你更加适应高级程序设计技术。希望对读者有帮助!


目录

10.6 特定容器算法

与其他容器不同,链表类型list和forward_list定义了儿个成员函数形式的算法,如表10.6所示。特别是,它们定义了独有的sort、merge、remove、reverse和unique。通用版本的sort要求随机访问迭代器,因此不能用于list和forward_1ist,因为这两个类型分别提供双向迭代器和前向迭代器。

链表类型定义的其他算法的通用版本可以用于链表,但代价太高。这些算法需要交换输入序列中的元素。一个链表可以通过改变元素间的链接而不是真的交换它们的值来快速"交换"元素。因此,这些链表版本的算法的性能比对应的通用版本好得多。

对于list和forward_list,应该优先使用成员函数版本的算法而不是通用算法.

表10.6:list和forward_list成员函数版本的算法

这些操作都返回void
lst.merge(lst2) 将来自Lst2的元素合并入lst。lst和lst2都必须是有序的。
lst.merge(lst2,comp) 元素将从Lst2中删除。在合并之后,lst2第一个版本使用<运算符;第二个版本使用给定的比较操作
lst.remove(val) 调用erase删除掉与给定值相等(二)或令一元谓词为真的每
lst.remove_if(pred) 个元素
lst.reverse() 反转lst中元素的顺序
lst.sort() 使用<或给定比较操作排序元素
lst.sort(comp)
lst.unique() 调用erase删除同一个值的连续拷贝。第一个版本使用一;第
lst.unique(pred) -个版本使用给定的二元谓词

splice成员

链表类型还定义了splice算法,其描述见表10.7。此算法是链表数据结构所特有的,因此不需要通用版本。

表10.7:list和forward_list的splice成员函数的参数

lst.splice(args)或flst.splice_after(args)
(p,lst2) p是一个指向Lst中元素的迭代器,或一个指向Elst首前位置的迭代器。函数将1st2的所有元素移动到1st中p之前的位置或是flst中p之后的位置。将元素从lst2中删除。lst2的类型必须与lst或flst相同,日不能是同一个链表
(p,lst2,p2) p2是一个指向lst2中位置的有效的迭代器。将p2指向的元素移动到Lst中,或将p2之后的元素移动到flst中。lst2可以是与lst或flst相同的链表
(p,lst2,b,e) b和e必须表示lst2中的合法范围。将给定范围中的元素从lst2移动到lst或flst。lst2与lst(或flst)可以是相同的链表,但p不能指向给定范围中元素

链表特有的操作会改变容器

多数链表特有的算法都与其通用版本很相似,但不完全相同。链表特有版本与通用版本间的一个至关重要的区别是链表版本会改变底层的容器。例如,remove的链表版本会删除指定的元素。unique的链表版本会删除第二个和后继的重复元素。

类似的,merge和splice会销毁其参数。例如,通用版本的merge将合并的序列写到一个给定的目的迪代器;两个输入序列是不变的。而链表版本的merge函数会销毁给定的链表一一元素从参数指定的链表中删除,被合并到调用merge的链表对象中。在merge之后,米自两个链表中的元素仍然存在,但它们都已在同一个链表中。

相关推荐
tan180°39 分钟前
MySQL表的操作(3)
linux·数据库·c++·vscode·后端·mysql
彭祥.2 小时前
Jetson边缘计算主板:Ubuntu 环境配置 CUDA 与 cudNN 推理环境 + OpenCV 与 C++ 进行目标分类
c++·opencv·分类
lzb_kkk2 小时前
【C++】C++四种类型转换操作符详解
开发语言·c++·windows·1024程序员节
胖大和尚4 小时前
clang 编译器怎么查看在编译过程中做了哪些优化
c++·clang
钱彬 (Qian Bin)5 小时前
一文掌握Qt Quick数字图像处理项目开发(基于Qt 6.9 C++和QML,代码开源)
c++·开源·qml·qt quick·qt6.9·数字图像处理项目·美观界面
双叶8366 小时前
(C++)学生管理系统(正式版)(map数组的应用)(string应用)(引用)(文件储存的应用)(C++教学)(C++项目)
c语言·开发语言·数据结构·c++
源代码•宸6 小时前
C++高频知识点(二)
开发语言·c++·经验分享
jyan_敬言8 小时前
【C++】string类(二)相关接口介绍及其使用
android·开发语言·c++·青少年编程·visual studio
liulilittle8 小时前
SNIProxy 轻量级匿名CDN代理架构与实现
开发语言·网络·c++·网关·架构·cdn·通信
tan77º9 小时前
【Linux网络编程】Socket - UDP
linux·服务器·网络·c++·udp