力扣 二叉树的层序遍历-102

二叉树的层序遍历-102

class Solution {
public:vector<vector<int>> levelOrder(TreeNode* root) {vector<vector<int>> res; // 二维数组用来存储每层节点if (root == nullptr)return res;queue<TreeNode*> q; // 队列用来进行层序遍历q.push(root);       // 将第一层的根节点加入队列中while (!q.empty()) {int n = q.size(); // 当前层的节点个数vector<int> vec;  // 用于存储当前层的所有节点for (int i = 1; i <= n; i++) {//遍历当前层的所有节点TreeNode* node = q.front();//将队列当前节点存下来q.pop();//将当前节点弹出队列vec.push_back(node->val);//将存下来的当前节点if (node->left)q.push(node->left);//如果当前节点有左节点,加入队列if (node->right)q.push(node->right);//如果当前节点有右节点,加入队列}res.push_back(vec);//将当前层的节点值加入结果}return res;}
};

什么是 C++ 中的函数对象?它有什么特点?函数对象与普通函数有什么区别? 如何定义和使用函数对象?

C++ 中的函数对象(Function Object)

函数对象(又称为函数符号)是一个可以像普通函数一样被调用的对象。在 C++ 中,函数对象是通过重载 operator() 来实现的。它的本质上是一个类的实例,而该类的实例具有函数调用的能力。因此,函数对象可以像普通函数一样在代码中传递和调用。

函数对象的特点

1.像函数一样调用:

        函数对象是通过重载 operator() 来实现的,它使得该对象能够像函数一样被调用。

2.可以有状态:

        函数对象与普通函数的最大区别是,函数对象可以拥有成员变量(即状态)。这使得它在多次调用时可以保持和修改状态。

3.可以传递给算法:

        函数对象可以作为参数传递给 C++ 标准库中的算法(如 std::sort、std::for_each 等),并且由于它们是对象,可以在调用时携带更多的上下文信息。

4.性能:

        函数对象通常可以通过内联优化,从而提高性能,特别是与普通函数指针相比,它们能更好地支持编译器优化。

5.支持多态:

        函数对象可以通过继承和多态进行扩展,支持不同的行为和策略模式。

函数对象与普通函数的区别

如何定义和使用函数对象

1. 定义函数对象

要定义一个函数对象,需要:

        创建一个类。

        在类中重载 operator() 方法,使对象能够像函数一样调用。

#include <iostream>
using namespace std;// 定义一个函数对象
class Add {
public:int operator()(int x, int y) {return x + y;  // 重载 operator() 实现加法操作}
};int main() {Add add;  // 创建函数对象cout << add(2, 3) << endl;  // 调用函数对象,相当于调用 add.operator()(2, 3)return 0;
}

输出:

5

2. 使用函数对象作为参数

函数对象可以作为参数传递给 C++ 标准库中的算法,像是 std::for_each、std::sort 等。

#include <iostream>
#include <vector>
#include <algorithm>using namespace std;// 函数对象:加法操作
class Add {
public:void operator()(int x) {cout << x + 10 << " ";  // 每个元素加 10}
};int main() {vector<int> nums = {1, 2, 3, 4, 5};// 使用函数对象作为参数for_each(nums.begin(), nums.end(), Add());return 0;
}

输出:

11 12 13 14 15

3. 函数对象作为排序准则

函数对象也可以用于自定义排序准则,比如与 std::sort 一起使用:

#include <iostream>
#include <vector>
#include <algorithm>using namespace std;// 函数对象:比较两个整数的大小
class Compare {
public:bool operator()(int x, int y) {return x > y;  // 降序排列}
};int main() {vector<int> nums = {5, 1, 8, 3, 7};// 使用函数对象作为排序准则sort(nums.begin(), nums.end(), Compare());// 打印排序后的结果for (int num : nums) {cout << num << " ";}return 0;
}

输出:

8 7 5 3 1

4. 函数对象的带状态

函数对象不仅仅能执行操作,还可以保存一些状态,下一次调用时可以利用这些状态。

#include <iostream>using namespace std;// 函数对象:加法器,带状态
class Adder {
private:int sum = 0;  // 存储状态public:void operator()(int x) {sum += x;  // 修改状态cout << "Current sum: " << sum << endl;}
};int main() {Adder add;add(10);  // sum = 10add(20);  // sum = 30add(30);  // sum = 60return 0;
}

输出:

Current sum: 10
Current sum: 30
Current sum: 60

在这个例子中,Adder 类通过一个成员变量 sum 来保存当前的总和,每次调用 operator() 时都会修改这个状态。

函数对象的应用场景

1.算法:

        C++ 标准库中有很多算法(如 std::for_each, std::sort, std::transform 等)都可以使用函数对象进行定制化操作。例如,使用函数对象作为排序准则,或者用作算法中的自定义操作。

2.回调机制:

        函数对象可以用来实现回调机制,它们的状态可以保存更多上下文信息,因此比普通函数更灵活。

3.自定义操作:

        需要在运行时根据某些条件定制化操作时,函数对象比普通函数更加灵活。通过在类中保存状态和行为,函数对象可以实现更复杂的行为。

总结

        函数对象 是可以像普通函数一样被调用的类实例,通过重载 operator() 来实现。

        函数对象的优势:除了能像普通函数一样调用,它们还能拥有状态,并且能够灵活扩展,使得代码更具可读性和可扩展性。

        与普通函数的区别:函数对象不仅可以像普通函数一样执行操作,还能够保存和改变状态,支持多态性和灵活性。

        应用:函数对象广泛应用于 C++ 标准库算法(如排序、遍历等)中,能够提供定制化的操作。

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

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

相关文章

kafka生产者和消费者命令的使用

kafka-console-producer.sh 生产数据 # 发送信息 指定topic即可 kafka-console-producer.sh \ --bootstrap-server bigdata01:9092 \ --topic topicA # 主题# 进程 29124 ConsoleProducer kafka-console-consumer.sh 消费数据 # 消费数据 kafka-console-consumer.sh \ --boo…

跨平台应用开发框架(3)-----Qt(样式篇)

目录 1.QSS 1.基本语法 2.QSS设置方式 1.指定控件样式设置 2.全局样式设置 1.样式的层叠特性 2.样式的优先级 3.从文件加载样式表 4.使用Qt Designer编辑样式 3.选择器 1.类型选择器 2.id选择器 3.并集选择器 4.子控件选择器 5.伪类选择器 4.样式属性 1.盒模型 …

阅读《基于蒙特卡洛法的破片打击无人机易损性分析》_笔记

目录 基本信息 1 引言 1.1 主要研究内容 1.2 研究必要性&#xff08;为什么要研究&#xff09; 1.3 该领域研究现状&#xff08;别人做了什么/怎么做的&#xff09; 2 主要研究过程&#xff08;我们做了什么&#xff09; 2.1 建立目标仿真模型 2.2 确定毁伤依据 2.3 无…

上海乐鑫科技一级代理商飞睿科技,ESP32-C61高性价比WiFi6芯片高性能、大容量

在当今快速发展的物联网市场中&#xff0c;无线连接技术的不断进步对智能设备的性能和能效提出了更高要求。为了满足这一需求&#xff0c;乐鑫科技推出了ESP32-C61——一款高性价比的Wi-Fi 6芯片&#xff0c;旨在为用户设备提供更出色的物联网性能&#xff0c;并满足智能设备连…

Qt Graphics View 绘图实例

Qt Graphics View 绘图实例 这个实例程序实现如下功能&#xff1a; 可以创建矩形、椭圆、三角形、梯形、直线、文字等基本图形。每个图形项都可以被选择和移动。图形项或整个视图可以缩放和旋转。图形项重叠时&#xff0c;可以调整前置或后置。多个图形项可以组合&#xff0c;…

JDK17源码系列-AbstractCollection接口源码解读

JDK17源码系列-AbstractCollection接口源码解读 1、AbstractCollection类图结构 2、AbstractCollection是实现Collection接口的顶级抽象类 3、模版方法&#xff0c;由子类实现 public abstract Iterator iterator()public abstract int size() 4、实现接口public boolean is…

深入浅出:JVM 的架构与运行机制

一、什么是JVM 1、什么是JDK、JRE、JVM JDK是 Java语言的软件开发工具包&#xff0c;也是整个java开发的核心&#xff0c;它包含了JRE和开发工具包JRE&#xff0c;Java运行环境&#xff0c;包含了JVM和Java的核心类库&#xff08;Java API&#xff09;JVM&#xff0c;Java虚拟…

任意文件读取漏洞(CVE-2024-7928)修复

验证CVE-2024-7928问题是否存在可以使用如下方法&#xff1a; https://域名/index/ajax/lang?lang..//..//目录名/文件名&#xff08;不带后缀&#xff09; 目录名是该项目的一个目录&#xff0c;这里目录位置为nginx设置站点目录为基准&#xff0c;网上两层目录。 文件名…

宠物领养系统的SpringBoot技术探索

摘 要 如今社会上各行各业&#xff0c;都在用属于自己专用的软件来进行工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。互联网的发展&#xff0c;离不开一些新的技术&#xff0c;而新技术的产生往往是为了解决现有问题而产生的。针对于宠物领养…

2-深度学习入门(持续更新)

数据操作 1&#xff09;获取数据&#xff1b;&#xff08;2&#xff09;将数据读入计算机后对其进行处理。 n维数组&#xff0c;也称为张量&#xff08;tensor&#xff09;。 使用过Python中NumPy计算包的读者会对本部分很熟悉。 无论使用哪个深度学习框架&#xff0c;它的张…

HTML CSS JS基础考试题与答案

一、选择题&#xff08;2分/题&#xff09; 1&#xff0e;下面标签中&#xff0c;用来显示段落的标签是&#xff08; d &#xff09;。 A、<h1> B、<br /> C、<img /> D、<p> 2. 网页中的图片文件位于html文件的下一级文件夹img中&#xff0c;…

火山引擎VeDI在AI+BI领域的演进与实践

随着数字化时代的到来&#xff0c;企业对于数据分析与智能决策的需求日益增强。作为新一代企业级数据智能平台&#xff0c;火山引擎数智平台VeDI基于字节跳动多年的“数据驱动”实践经验&#xff0c;也正逐步在AI&#xff08;人工智能&#xff09;与BI&#xff08;商业智能&…

Could not locate device support files.

报错信息&#xff1a;Failure Reason: The device may be running a version of iOS (13.6.1 17G80) that is not supported by this version of Xcode.[missing string: 869a8e318f07f3e2f42e11d435502286094f76de] 问题&#xff1a;xcode15升级到xcode16之后&#xff0c;13.…

数据结构与算法(排序算法)

排序的概念 1. 排序是指将一组数据&#xff0c;按照特定的顺序进行排列的过程。 2. 这个过程通常是为了使数据更加有序&#xff0c;从而更容易进行搜索、比较或其他操作。 常见的排序算法 插入排序 1. 把待排序的记录&#xff0c;按其关键码值的大小&#xff0c;逐个插入到一…

Scala身份证上的秘密以及Map的遍历

object test {def main(args: Array[String]): Unit {val id "42032220080903332x"//1.生日是&#xff1f;//字符串截取val birthday id.substring(10,14) //不包括终点下标println(birthday)val year id.substring(6,10) //println(year)//性别&#xff1a;倒数第…

uni-app 蓝牙开发

一. 前言 Uni-App 是一个使用 Vue.js 开发&#xff08;所有&#xff09;前端应用的框架&#xff0c;能够编译到 iOS、Android、快应用以及各种小程序等多个平台。因此&#xff0c;如果你需要快速开发一款跨平台的应用&#xff0c;比如在 H5、小程序、iOS、Android 等多个平台上…

OminiControl:一个新的FLUX通用控制模型,单个模型实现图像主题控制和深度控制

之前的文章中和大家介绍过Flux团队开源了一系列工具套件&#xff0c;感兴趣的小伙伴可以点击下面链接阅读~ AI图像编辑重大升级&#xff01;FLUX.1 Tools发布&#xff0c;为创作者提供了更强大的控制能力。 OminiControl 也开源了其可控生成模型。OminiControl 是一个最小但功…

使用R的数据包快速获取、调用各种地理数据

数据一直是科学研究绕不开的话题&#xff0c;为了方便快捷的获取各种地理数据&#xff0c;许多R包被开发出来&#xff0c;今天介绍一些方便快捷的数据R包。 rnaturalearth 包使 Natural Earth 数据可用。自然地球特征包括 1&#xff1a;10m、1&#xff1a;50m 和 1&#xff1a…

如何让控件始终处于父容器的居中位置(父容器可任意改变大小)

1、改变父容器大小前 父容器是一个panel&#xff0c;控件是一个按钮button1 1&#xff09;刚开始让button1的左边距离panel的左边缘和button1的右边距离panel的右边缘两个距离相等&#xff1b; 2&#xff09;将button1的Anchor属性设置为None 2、改变父容器大小后 直接改变…

数据类型.

数据类型分类 数值类型 tinyint类型 以tinyint为例所有数值类型默认都是有符号的&#xff0c;无符号的需要在后面加unsignedtinyint的范围在-128~127之间无符号的范围在0~255之间(类比char) create database test_db; use test_db;建表时一定要跟着写上属性 mysql> creat…