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

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

前言


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;
}


c44437ac094045adb737affa146eccf2.png

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;
}


bf63e1693f5c4641ad9e698e2790c569.png

在这个示例中,我们声明了两个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;
}


8dca195db18f4251b927a537d77b10ff.png

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

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


总结


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

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

目录
打赏
0
0
0
0
61
分享
相关文章
【c++丨STL】基于红黑树模拟实现set和map(附源码)
本文基于红黑树的实现,模拟了STL中的`set`和`map`容器。通过封装同一棵红黑树并进行适配修改,实现了两种容器的功能。主要步骤包括:1) 修改红黑树节点结构以支持不同数据类型;2) 使用仿函数适配键值比较逻辑;3) 实现双向迭代器支持遍历操作;4) 封装`insert`、`find`等接口,并为`map`实现`operator[]`。最终,通过测试代码验证了功能的正确性。此实现减少了代码冗余,展示了模板与仿函数的强大灵活性。
28 2
【c++丨STL】map/multimap的使用
本文详细介绍了STL关联式容器中的`map`和`multimap`的使用方法。`map`基于红黑树实现,内部元素按键自动升序排列,存储键值对,支持通过键访问或修改值;而`multimap`允许存在重复键。文章从构造函数、迭代器、容量接口、元素访问接口、增删操作到其他操作接口全面解析了`map`的功能,并通过实例演示了如何用`map`统计字符串数组中各元素的出现次数。最后对比了`map`与`set`的区别,强调了`map`在处理键值关系时的优势。
114 73
|
10天前
|
【c++丨STL】set/multiset的使用
本文深入解析了STL中的`set`和`multiset`容器,二者均为关联式容器,底层基于红黑树实现。`set`支持唯一性元素存储并自动排序,适用于高效查找场景;`multiset`允许重复元素。两者均具备O(logN)的插入、删除与查找复杂度。文章详细介绍了构造函数、迭代器、容量接口、增删操作(如`insert`、`erase`)、查找统计(如`find`、`count`)及`multiset`特有的区间操作(如`lower_bound`、`upper_bound`、`equal_range`)。最后预告了`map`容器的学习,其作为键值对存储的关联式容器,同样基于红黑树,具有高效操作特性。
35 3
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
C++ 标准模板库(STL)提供了一组功能强大的容器类,用于存储和操作数据集合。不同的容器具有独特的特性和应用场景,因此选择合适的容器对于程序的性能和代码的可读性至关重要。对于刚接触 C++ 的开发者来说,了解这些容器的基础知识以及它们的特点是迈向高效编程的重要一步。本文将详细介绍 C++ 常用的容器,包括序列容器(`std::vector`、`std::array`、`std::list`、`std::deque`)、关联容器(`std::set`、`std::map`)和无序容器(`std::unordered_set`、`std::unordered_map`),全面解析它们的特点、用法
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
|
27天前
|
【c++丨STL】priority_queue(优先级队列)的使用与模拟实现
本文介绍了STL中的容器适配器`priority_queue`(优先级队列)。`priority_queue`根据严格的弱排序标准设计,确保其第一个元素始终是最大元素。它底层使用堆结构实现,支持大堆和小堆,默认为大堆。常用操作包括构造函数、`empty`、`size`、`top`、`push`、`pop`和`swap`等。我们还模拟实现了`priority_queue`,通过仿函数控制堆的类型,并调用封装容器的接口实现功能。最后,感谢大家的支持与关注。
68 1
|
2月前
|
【c++丨STL】stack和queue的使用及模拟实现
本文介绍了STL中的两个重要容器适配器:栈(stack)和队列(queue)。容器适配器是在已有容器基础上添加新特性或功能的结构,如栈基于顺序表或链表限制操作实现。文章详细讲解了stack和queue的主要成员函数(empty、size、top/front/back、push/pop、swap),并提供了使用示例和模拟实现代码。通过这些内容,读者可以更好地理解这两种数据结构的工作原理及其实现方法。最后,作者鼓励读者点赞支持。 总结:本文深入浅出地讲解了STL中stack和queue的使用方法及其模拟实现,帮助读者掌握这两种容器适配器的特性和应用场景。
73 21
深入浅出 C++ STL:解锁高效编程的秘密武器
C++ 标准模板库(STL)是现代 C++ 的核心部分之一,为开发者提供了丰富的预定义数据结构和算法,极大地提升了编程效率和代码的可读性。理解和掌握 STL 对于 C++ 开发者来说至关重要。以下是对 STL 的详细介绍,涵盖其基础知识、发展历史、核心组件、重要性和学习方法。
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
【C++进阶】特殊类设计 && 单例模式
通过对特殊类设计和单例模式的深入探讨,我们可以更好地设计和实现复杂的C++程序。特殊类设计提高了代码的安全性和可维护性,而单例模式则确保类的唯一实例性和全局访问性。理解并掌握这些高级设计技巧,对于提升C++编程水平至关重要。
39 16

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等