【C++STL基础入门】list的运算符重载和关于list的算法

2023-09-18 19:03:12


前言

C++标准模板库(STL)是一组强大而灵活的工具,用于处理数据结构和算法。其中,std::list是STL中的一个重要容器,它实现了双向链表的数据结构,具有高效的插入和删除操作。本文将介绍list容器的运算符重载和相关算法,帮助初学者了解如何使用list容器。


一、list运算符

1.1 逻辑运算符

1、==:相等运算符用于检查两个 list 是否相等,即元素数量相同且对应位置上的元素值相等。

2、!=:不等运算符用于检查两个 list 是否不相等,即元素数量不同或至少有一个对应位置上的元素值不相等。

3、<=:小于等于运算符用于比较两个 list 的大小关系,基于字典顺序对其进行逐个元素的比较。返回结果为 true 表示左侧的 list 在字典顺序上小于或等于右侧的 list,否则返回 false。

4、>=:大于等于运算符用于比较两个 list 的大小关系,基于字典顺序对其进行逐个元素的比较。返回结果为 true 表示左侧的 list 在字典顺序上大于或等于右侧的 list,否则返回 false。

5、<:小于运算符用于比较两个 list 的大小关系,基于字典顺序对其进行逐个元素的比较。返回结果为 true 表示左侧的 list 在字典顺序上小于右侧的 list,否则返回 false。

6、>:大于运算符用于比较两个 list 的大小关系,基于字典顺序对其进行逐个元素的比较。返回结果为 true 表示左侧的 list 在字典顺序上大于右侧的 list,否则返回 false。

示例代码:

#include <iostream>
#include <list>

int main() {
    std::list<int> list1 = {1, 2, 3};
    std::list<int> list2 = {1, 2, 3};
    std::list<int> list3 = {4, 5, 6};

    // == operator
    if (list1 == list2) {
        std::cout << "list1 and list2 are equal" << std::endl;
    } else {
        std::cout << "list1 and list2 are not equal" << std::endl;
    }

    // != operator
    if (list1 != list3) {
        std::cout << "list1 and list3 are not equal" << std::endl;
    } else {
        std::cout << "list1 and list3 are equal" << std::endl;
    }

    // <= operator
    if (list1 <= list2) {
        std::cout << "list1 is less than or equal to list2" << std::endl;
    } else {
        std::cout << "list1 is greater than list2" << std::endl;
    }

    // >= operator
    if (list3 >= list2) {
        std::cout << "list3 is greater than or equal to list2" << std::endl;
    } else {
        std::cout << "list3 is less than list2" << std::endl;
    }

    // < operator
    if (list1 < list3) {
        std::cout << "list1 is less than list3" << std::endl;
    } else {
        std::cout << "list1 is greater than or equal to list3" << std::endl;
    }

    // > operator
    if (list3 > list2) {
        std::cout << "list3 is greater than list2" << std::endl;
    } else {
        std::cout << "list3 is less than or equal to list2" << std::endl;
    }

    return 0;
}

在这里插入图片描述

1.2 赋值运算符

C++ STL中的赋值运算符(Assignment Operator)用于将一个容器的值复制给另一个容器。它允许你以一种简洁的方式将一个容器的内容复制到另一个容器中,并且可以用于同一类型的容器之间的赋值操作。

赋值运算符有以下功能:

将一个容器的值复制给另一个容器。
清空目标容器并替换为源容器的内容。
如果目标容器和源容器的类型不同,会进行相应的类型转换(如果可用)。
下面是一个使用C++ STL的赋值运算符的示例代码:

#include <iostream>
#include <vector>

int main() {
    std::vector<int> source = {1, 2, 3}; // 源容器
    std::vector<int> destination;       // 目标容器

    destination = source;  // 使用赋值运算符将源容器的值复制给目标容器

    // 输出目标容器的内容
    std::cout << "目标容器的值:";
    for (const auto& num : destination) {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    return 0;
}

在这里插入图片描述

在这个示例中,我们声明了两个vector容器:source和destination。source容器包含整数1、2和3。然后,我们使用赋值运算符将source容器的值复制给destination容器。通过将源容器赋值给目标容器,目标容器将获得与源容器相同的元素。

最后,我们通过迭代目标容器中的元素,并将它们输出到控制台来验证赋值运算符的结果。

当运行这段代码时,输出将显示目标容器中的值为:1 2 3,表示赋值运算符成功将源容器的值复制给了目标容器。

二、list相关算法

2.1 查找函数

1、InputIterator find( InputIterator _First, InputIterator _Last, const Type& _Val );
函数 find 的功能如下:

find 函数用于在指定的范围内查找某个值 _Val。
它从 _First 迭代器指向的位置开始查找,一直搜索到 _Last 迭代器指向的位置(不包括 _Last)。
如果找到了匹配的值,则返回指向该值的迭代器。
如果没有找到匹配的值,则返回指向 _Last 的迭代器。
函数参数说明如下:

_First:指向要搜索的范围的起始位置的迭代器。
_Last:指向要搜索的范围的结束位置的迭代器(不包括在搜索范围内)。
_Val:要查找的值。
返回值:

返回一个迭代器,指向第一个匹配的元素。
如果没有找到匹配的元素,则返回指向 _Last 的迭代器。
下面是一个使用 find 函数的示例代码:

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> numbers = {1, 2, 3, 4, 5};

    // 在 numbers 容器中查找值为 3 的元素
    auto it = std::find(numbers.begin(), numbers.end(), 3);

    if (it != numbers.end()) {
        // 找到了匹配的元素
        std::cout << "找到了值为 3 的元素,位置在:" << std::distance(numbers.begin(), it) << std::endl;
    } else {
        // 没有找到匹配的元素
        std::cout << "没有找到值为 3 的元素" << std::endl;
    }

    return 0;
}

在这里插入图片描述

在这个示例中,我们有一个整数向量 numbers,其中包含了一些整数。我们使用 std::find 函数在 numbers 容器中查找值为 3 的元素。如果找到了匹配的元素,我们输出它的位置(使用 std::distance 函数获取迭代器的位置),否则输出未找到的提示。

在运行示例代码时,输出将取决于找到与否。如果找到了值为 3 的元素,则输出其位置;否则输出未找到的提示信息。


总结

本文介绍了list容器的运算符重载和相关算法。运算符重载使得对list容器的操作更加方便和简洁,而相关算法则提供了丰富的功能来处理list容器中的元素。要熟练使用list容器,需要掌握这些运算符重载和算法的用法,并结合实际需求进行灵活运用。

通过学习list容器的运算符重载和相关算法,你将能够更加高效地操作list容器,处理数据和解决问题。希望本文能够帮助你在C++中充分发挥STL的力量,提升编程技能。

更多推荐

[JAVAee]SpringBoot配置文件

配置文件的介绍配置文件当中记录了许多重要的配置信息,例如:数据库的连接信息(用户的账户与密码)项目的启动端口第三方系统的调用密匙用于记录问题产生的日志在spring框架中一些特定的框架会自动调用配置文件中的配置信息来运用.配置文件中的属性也起到了类似全局变量的作用.对于一个项目,可以准备多种配置文件方便自由调用来应对不

tdesign的文件上传(微信小程序+idea的springboot)

目录1.springboot后端1.1FileController.java1.2listener文件的ErpApplicationListener.java1.3【重点!】FileServiceImpl层1.4IFileService1.5StringUtil通用类1.6主程序加一个监听器1.7application

Spring学习笔记1 启示录

写段代码,引出Spring的好处创建个空工程,然后在工程里建模块可能是IEAD版本问题,每次建新的空工程,都需要退出重进设置下maven和Encoding新建模块持久层接口持久层实现类业务层接口业务层实现类控制层(表现层)建个测试类测试分析这个程序存在的问题假设现在新需求是因某种原因需要改变Dao层的实现类并且在业务层

Feign远程调用丢失请求头

前言我们在写服务端项目的时候,总会限制对某些资源的访问,最常见的就是要求用户先登录才能访问资源,当用户登录后就会将此次会话信息保存进session,同时返回给浏览器指定的cookie键值,下次浏览器再次访问,请求头中就会携带这个cookie,我们也以次来识别用户的登录状态,做出正确响应。一、问题有时候,我们先行登录,然

什么是 Spring Boot Starter?(InsCode AI 创作助手)

当你开始使用SpringBoot开发应用程序时,你可能会听说过SpringBootStarter,它是SpringBoot框架的一个关键概念。本篇博客将详细介绍SpringBootStarter是什么,为什么它如此重要,以及如何使用它来简化SpringBoot项目的依赖管理。什么是SpringBootStarter?S

CG Magic分享同一场景里下,VR渲染器和CR渲染器哪个好?

渲染操作时,VR渲染器和CR渲染器的对比成为常见问题了。这个问题很多人都会问。今天CGMagic小编通过一个真实的项目,就是同一场景下来比较一下VR渲染器和CR渲染器的区别。以下图为例是用来测试的场景当年的最终图。采用了当年的一个伊丽莎白大街152号的项目场景,来做一下测试。1、用VR渲染,大小为2K,这张图耗时75分

(21)多线程实例应用:双色球(6红+1蓝)

一、需求1.双色球:投注号码由6个红色球号码和1个蓝色球号码组成。2.红色球号码从01--33中选择,红色球不能重复。3.蓝色球号码从01--16中选择。4.最终结果7个号码:6+1;即33选6(红)+16选1(蓝)5.产品:能用;用户放心使用;原则:靠运气,不能有暗箱操作,号码开奖的随机性。6.做法思路:(1)从左往

短视频矩阵源码系统

一、什么是短视频矩阵源码?短视频矩阵源码是一种基于短视频平台的软件程序,它可以帮助用户在多个短视频平台上进行短视频营销。短视频矩阵源码包含了多种功能,例如短视频上传、短视频批量管理、短视频数据分析等等。用户可以根据自己的需求,选择不同的功能来实现短视频营销的目标。二、短视频矩阵源码的优势是什么?节省时间和人力成本:短视

智能热水器丨打造智能家居新体验

随着科学技术的不断发展,智能电器越来越被大众所采纳,如智能扫地机,智能洗衣机,智能微波炉等等,越来越智能的电器为人们的生活带来了许多便利。以往的热水器一般都是只有按键/机械的控制方式,没有其他无线控制的控制方式。但现在新增了语音功能控制。用户通过语音控制智能热水器进行加热或保温等操作,无需用户手动控制;为人们带来了全新

微信小程序隐私授权

微信开发者平台新公告:2023年9月15之后,隐私协议将被启用,所以以后的小程序都要加上隐私协议的内容提示用户,首先设置好隐私协议的内容,登录小程序的开发者后台,在设置--》服务内容声明--》用户隐私保护指引,点击右侧的“更新”,可以在线编辑隐私协议内容,编辑完保存;然后在代码中创建一个components文件夹,用来

【ELK】日志系统&部署

一、ELK日志分析系统1、ELK的组成ElasticSearchLogStashKibanaELK基于这三个开源日志的收集、存储、检索和可视化的解决方案;可帮助用户快速定位和分析应用程序的故障,监控应用程序性能和安全,以及提供丰富的数据分析和展示功能。2、完整日志系统特征ELK是一个完整的处理分析日志的系统收集:能够采

热文推荐