岛屿数量C++11新特性
每日一题
200. 岛屿数量
class Solution
{//使用深度的优先搜索来搜索岛屿图//遍历整个图片 当char数组的值为1时开始从这个点开始往外扩散搜索//注意处理边界 图不是正方形
public:int ans;int d[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};int N;int M;void dfs(vector<vector<char>> &grid, vector<vector<int>> &vis, int i, int j){for (int k = 0; k < 4; k++){int nx = i + d[k][0];int ny = j + d[k][1];if (nx < 0 || nx > N - 1 || ny < 0 || ny > M - 1)continue;if (!vis[nx][ny]&& grid[nx][ny] != '0'){vis[nx][ny] = 1;dfs(grid, vis, nx, ny);}}}int numIslands(vector<vector<char>> &grid){ans = 0;N = grid.size();M = grid[0].size();vector<vector<int>> vis(N, vector<int>(M, 0));for (int i = 0; i < N; i++){for (int j = 0; j < M; j++){if (!vis[i][j] && grid[i][j] != '0'){ans++;vis[i][j] = 1;dfs(grid, vis, i, j);}}}return ans;}
};
C++11新特性
自动类型推导(auto 和 decltype):
在C++中,自动类型推导是通过auto
和decltype
来实现的。这些关键字让程序员能够在不显式指定类型的情况下,依赖编译器自动推导出变量的类型
auto
:
auto
关键字用于自动推导变量的类型。编译器根据初始化表达式的类型来推导变量的类型。- 它使得代码更加简洁,尤其是在声明复杂类型(如迭代器或lambda表达式)时非常有用。
- 使用示例:
-
auto x = 42; // x的类型是int auto y = 3.14; // y的类型是double auto ptr = new int(10); // ptr的类型是int*
decltype
:
decltype
关键字用于推导一个表达式的类型,但与auto
不同的是,decltype
是在编译时对表达式类型的静态分析,返回的是表达式的实际类型。- 它常用于模板编程,或者当你想要获得某个表达式类型但又不确定时非常有用。
- 使用示例:
-
int x = 42; decltype(x) y = 10; // y的类型是int,与x相同
右值引用和移动语义:
右值引用和移动语义是C++11引入的重要特性,用来优化资源管理,尤其是在处理动态分配内存、数组、容器等时,避免不必要的深拷贝。
右值引用:
-
右值引用是通过
&&
符号表示的,允许我们绑定到右值(临时对象、即将销毁的对象)上。 -
在传统的C++中,右值只能绑定到常量或临时变量,但通过右值引用,程序员可以显式地“转移”对象的所有权。
-
右值引用通常与移动语义一起使用,使得对象的资源(如内存、文件句柄等)能够从一个对象转移到另一个对象,而不是进行深拷贝。
-
使用示例:
-
int&& r = 10; // r是右值引用,绑定到临时值10
移动语义:
-
移动语义允许对象的资源(如内存或文件句柄)在不进行深拷贝的情况下,从一个对象“移动”到另一个对象。
-
通过实现移动构造函数和移动赋值运算符,C++能够通过右值引用有效地转移资源而不是复制。
-
在标准库容器(如
std::vector
、std::string
)中,移动语义显著提高了性能,因为容器可以直接将元素从一个容器转移到另一个容器,而不需要复制每个元素。 -
使用示例:
-
class MyClass { public:MyClass(int size) : data(new int[size]) {}~MyClass() { delete[] data; }// 移动构造函数MyClass(MyClass&& other) noexcept : data(other.data) {other.data = nullptr;}// 移动赋值运算符MyClass& operator=(MyClass&& other) noexcept {if (this != &other) {delete[] data;data = other.data;other.data = nullptr;}return *this;}private:int* data; };
详解等于号运算符重载实现移动语义
MyClass& operator=(MyClass&& other) noexcept {if (this != &other) {delete[] data; // 1data = other.data; // 2other.data = nullptr; // 3}return *this; // 4
}
1. if (this != &other)
这行代码用来确保我们没有将一个对象赋值给它自己。我们需要避免以下的情况:
obj1 = std::move(obj1); // 这样就会发生自赋值
如果this
和&other
是相同的(即它们指向的是同一个对象),那么在移动操作时会导致对象的资源被错误地释放,最终使得对象处于不一致的状态。因此,首先通过这个条件判断来确保移动赋值操作不会出现自赋值的情况。
2. delete[] data;
这行代码释放当前对象的资源,尤其是类中的动态分配内存(data
指针指向的内存)。在进行移动赋值操作时,我们必须释放当前对象的资源,以便为从other
对象“移动”资源做好准备。
为什么要释放资源?
在“移动”资源之前,我们需要确保当前对象没有持有相同的资源。假设data
指向动态分配的内存,在data = other.data;
之后,data
和other.data
指向同一块内存。如果不释放原有的内存,就会导致内存泄漏,因为对象this
和other
都持有相同的资源指针,但other
指针的析构时会释放这块内存,导致this
的指针悬挂,出现不一致的行为。
3. data = other.data;
这行代码将other
对象的data
指针赋给当前对象data
,实现资源的“转移”。也就是说,我们把other
对象所管理的内存(资源)转移到当前对象this
上。other.data
指向原来的内存块,而this->data
也指向同一块内存块。
此时,this
对象就拥有了other
对象的资源,other
对象中的data
指针指向了同样的内存,而other
对象的资源将不再有效。
4. other.data = nullptr;
在这行代码中,我们将other.data
指针置为nullptr
。这是为了确保other
对象在析构时不会试图释放资源。由于我们已经将other
对象的资源转移给了this
,other
对象不再拥有该资源,因此将other.data
置为nullptr
可以防止其析构时错误地删除内存。
这一步是移动操作的核心,确保在移动后,other
对象不会误操作原本应该由this
对象管理的内存,避免多次释放同一块内存。
5. return *this;
最后,返回*this
,即当前对象的引用。这是符合赋值运算符规范的做法,返回*this
允许链式赋值操作,例如:
a = b = c;
这里a = b = c;
首先执行b = c;
,然后执行a = b;
,每次都会返回赋值后的对象,以便进行下一次赋值。
为什么使用noexcept
?
noexcept
关键字表示这个移动赋值运算符不抛出任何异常。移动操作通常不需要动态分配内存或者执行复杂的操作,因此它应该是一个不会抛出异常的操作。如果移动赋值操作抛出异常,则会破坏对象状态的一致性,并导致潜在的问题。
相关文章:
岛屿数量C++11新特性
每日一题 200. 岛屿数量 class Solution {//使用深度的优先搜索来搜索岛屿图//遍历整个图片 当char数组的值为1时开始从这个点开始往外扩散搜索//注意处理边界 图不是正方形 public:int ans;int d[4][2] {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};int N;int M;void dfs(vector<…...
Git 快速入门:全面了解与安装步骤
Git 快速入门:全面了解与安装步骤 一、关于Git 1.1 简介 Git 是一个开源的分布式版本控制系统,由 Linus Torvalds 于 2005 年创建,最初是为了更好地管理 Linux 内核开发而设计。 Git用于跟踪计算机文件的变化,特别是源代码文件…...
基于域自适应的双光融合
目录 引言DAF-Net编码器-解码器分支编码器部分融合层解码器部分 域自适应层概述多核最大均值差异(MK-MMD)第一阶段:编码器-解码器分支训练训练过程损失函数 第二阶段:融合层训练训练过程损失函数 实验与结果总结 文章声明…...
迭代器模式 (Iterator Pattern)
文章目录 迭代器模式 (Iterator Pattern)原理优点缺点示例代码场景描述1. 定义迭代器接口2. 定义集合接口3. 实现具体集合类4. 客户端代码输出结果 UML 类图使用场景优化与扩展小结 迭代器模式 (Iterator Pattern) 迭代器模式是一种 行为型设计模式,用于顺序访问集…...
039集——渐变色之:CAD中画彩虹()(CAD—C#二次开发入门)
(来左边儿 跟我一起画个龙,在你右边儿 画一道彩虹 ~~~~~~~~~~~ ) 效果如下: namespace AcTools {public class Class1{public Wform.Timer timer;//定时器需建在类下面public static DateTime startTime;[CommandM…...
如何将 GitHub 私有仓库(private)转换为公共仓库(public)
文章目录 如何将 GitHub 私有仓库转换为公共仓库步骤 1: 登录 GitHub步骤 2: 导航到目标仓库步骤 3: 访问仓库设置步骤 4: 更改仓库可见性步骤 5: 确认更改步骤 6: 验证更改注意事项 如何将 GitHub 私有仓库转换为公共仓库 在软件开发领域,GitHub 是一个广受欢迎的…...
C++11 右值引用
目录 左值 右值 左值引用与右值引用比较 左值引用总结: 右值引用总结: 左值引用的使用场景: 引用传参和做返回值都可以提高效率(减少拷贝) 左值引用的短板: 右值引用和移动语义解决上述问题: 下面就是有移动…...
WPS表格学习计划与策略
一、学习目标 掌握WPS表格的基本操作:包括新建、打开、保存工作簿,单元格的编辑与格式化,数据的输入与验证等。熟练运用WPS表格的数据处理功能:包括数据排序、筛选、分类汇总,以及使用公式和函数进行计算和分析。学会制作图表与数据可视化:掌握不同类型图表(如柱状图、折…...
Android 引入 proto 项目及使用方法
Proto(Protocol Buffers)是Google开发的一种语言无关、平台无关的序列化结构数据的方法,它类似于JSON和XML,但相对于XML而言更小,相对于JSON而言解析更快,支持多语言。以下是将Proto引入Android项目的方法及…...
VSOMEIP主要流程的时序
请求服务: client应用: application_impl::request_service routing_manager_client::request_service (老版本是routing_manager_proxy) routing_manager_client::send_request_services protocol::request_service_command its_command; // 创建…...
右值引用和移动语义:
C 右值引用和移动语义详解 在 C 的发展历程中,右值引用和移动语义的引入带来了显著的性能提升和编程灵活性。本文将深入探讨右值引用和移动语义的概念、用法以及重要性。 一、引言 C 作为一门高效的编程语言,一直在不断演进以满足现代软件编程的需求。…...
经纬高LLA转地心地固ECEF坐标,公式,代码
经纬高转地心地固的目的 坐标系转换是gis或者slam系统常见操作。GNSS获取的一般是经纬高,经纬高在slam系统里无法应用,slam系统一般是xyz互相垂直的笛卡尔坐标系,所以需要把GNSS的经纬高转到直角坐标系地心地固ECEF或者高斯投影GKP。 划重点…...
VUE前端实现天爱滑块验证码--详细教程
第一步: Git地址:tianai-captcha-demo: 滑块验证码demo 找到目录 src/main/resources/static,拷贝 static 并改名为 tac 即可。 第二步: 将改为 tac 的文件,放进项目根目录中,如下图: 第三步࿱…...
【链表】【删除节点】【刷题笔记】【灵神题单】
237.删除链表的节点 链表删除节点的本质是不用删除,只需要操作指针,跳过需要删除的节点,指向下下一个节点即可! 删除某个节点,但是不知道这个节点的前一个节点,也不知道头节点!摘自力扣评论区…...
springboot339javaweb的新能源充电系统pf(论文+源码)_kaic
毕 业 设 计(论 文) 题目:新能源充电系统的设计与实现 摘 要 如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解…...
【嵌入式——QT】QT制作安装包
第一步 QT程序写好之后,编译release版本 第二步 拿到release生成的.exe文件 第三步 新建文件夹deploy 第四步 将.exe文件复制到deploy目录下 第五步 在该目录下输入cmd指令,回车 第六步 在打开的命令窗口下输入 windeployqt TegNetCom_1.0.…...
python的文件操作练习
文件操作:成绩统计 有一个文件grades.txt,文件内容是每行一个学生的成绩(格式:姓名,成绩)。要求: 读取文件内容,统计所有学生的平均成绩; 将不及格(<60分)…...
jQuery九宫格抽奖,php处理抽奖信息
功能介绍 jQuery九宫格抽奖是一种基于jQuery库的前端抽奖效果。通过九宫格的形式展示抽奖项,用户点击抽奖按钮后,九宫格开始旋转,最终停在一个随机位置上,此位置对应的抽奖项为用户的中奖结果。 本文实现九宫格的步骤为…...
2024年一级建造师考试成绩,即将公布!
一级建造师考试成绩一般在考试结束后3个月左右的时间公布! 根据官方通知,重庆、江苏、青海、江西、云南、湖南、福建、北京、山西、黑龙江等地在今年一建报名通知里提到:2024年一级建造师考试成绩预计于2024年12月上旬公布。考生可在这个时间…...
M4V 视频是一种什么格式?如何把 M4V 转为 MP4 格式?
M4V 是一种视频文件格式,主要由苹果公司用于其产品和服务中,如 iTunes Store 上的电影和电视节目。这种格式可以包含受版权保护的内容,并且通常与苹果的 DRM(数字版权管理)技术结合使用,以限制内容的复制和…...
Leetcode 每日一题 104.二叉树的最大深度
目录 问题描述 示例 示例 1: 示例 2: 约束条件 题解 方法一:广度优先搜索(BFS) 步骤 代码实现 方法二:递归 步骤 代码实现 结论 问题描述 给定一个二叉树 root,我们需要返回其最大…...
文件上传漏洞:你的网站安全吗?
文章目录 文件上传漏洞攻击方式:0x01绕过前端限制0x02黑名单绕过1.特殊解析后缀绕过2..htaccess解析绕过3.大小写绕过4.点绕过5.空格绕过6.::$DATA绕过7.配合中间件解析漏洞8.双后缀名绕过9.短标签绕过 0x03白名单绕过1.MIME绕过(Content-Type绕过)2.%00截断3.0x00截…...
AWS账号提额
Lightsail提额 控制台右上角,用户名点开,选择Service Quotas 在导航栏中AWS服务中找到lightsail点进去 在搜索框搜索instance找到相应的实例类型申请配额 4.根据自己的需求选择要提额的地区 5.根据需求来提升配额数量,提升小额配额等大约1小时生效 Ligh…...
电子应用设计方案-29:智能云炒菜系统方案设计
智能云炒菜系统方案设计 一、系统概述 本智能云炒菜系统旨在为用户提供便捷、高效、个性化的烹饪体验,结合云技术实现远程控制、食谱分享、智能烹饪流程优化等功能。 二、系统组成 1. 炒菜锅主体 - 高品质不粘锅内胆,易于清洁和维护。 - 加热装置&#x…...
腾讯rapidJson使用例子
只需要把库的头文件拿下来加入项目中使用就行,我是以二进制文件存储内容并解析: #include <iostream> #include <fstream> #include <string> #include "rapidjson/document.h" #include "rapidjson/error/en.h"…...
UE5_CommonUI简单使用(2)
上篇我是简单写了一下CommonUI使用的初始设置以及Common Activatable Widget和Common Activatable Widget Stack以及Common 控件Style以及鼠标控制的一些内容,这些对于了解UMG的朋友来说没什么难度,唯一需要注意的就是Common Activatable Widget Stack堆栈管理只能是用来管理…...
探讨播客的生态系统
最近对播客发生了兴趣,从而引起了对播客背后的技术,生态的关注。本文谈谈播客背后的技术生态系统。 播客很简单 播客(podcast)本质上就是以语音的方式发布信息。它和博客非常类似。如果将CSDN 网站上的文字加一个语音播报。CSDN …...
淘宝架构演化
基本功能 LAMP(LinuxApacheMySQLPHP)标准架构,初期采用拿来主义,只具备基本功能。 数据库:读写分离,MyISAM存储引擎 2003年5月—2004年1月 存储瓶颈 mysql达到访问瓶颈,升级成oracle&#x…...
软通动力携子公司鸿湖万联、软通教育助阵首届鸿蒙生态大会成功举办
11月23日中国深圳,首届鸿蒙生态大会上,软通动力及软通动力子公司鸿湖万联作为全球智慧物联网联盟(GIIC)理事单位、鸿蒙生态服务(深圳)有限公司战略合作伙伴,联合软通教育深度参与了大会多项重磅…...
【AI绘画】DALL·E 3 绘图功能与 DALL·E API 探索
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: AI绘画 文章目录 💯前言💯DALLE 3 图像生成介绍(Introduction to DALLE 3 Image Generation)图像质量与分辨率图像生成机制的解析多图生成功能 💯使用 DALLE…...
东南亚cod建站系统/大二网页设计作业成品
统信UOS系统镜像-最新版本(永久有效,持续更新) 链接: https://pan.baidu.com/s/1hrnHmyGV83VhATsB5OqijQ 密码: h9ku 注:本共享链接来源自统信工程师...
南京网站优樱化/怎么做营销
小黄在工作中遇到使用MQTT接收消息,正好遇到个机会浅浅的学习一下如何使用MQTT 【转载出处——大道迷途】 SpringBoot2.0集成MQTT消息推送功能 SpringBoot2.0集成MQTT功能之消息订阅处理...
做平台网站要多久/百度健康人工客服电话24小时
GCC 命令行详解 -L 指定库的路径 -l 指定需连接的库名 为什么会出现undefined reference to xxxxx错误?首先这是链接错误,不是编译错误,也就是说如果只有这个错误,说明你的程序源码本身没有问题,是你用编译器编译时参数…...
外贸 企业网站 建设/海外市场推广策略
呦西朋友们,告诉你们一个炒鸡炒鸡大的好消息!!!经过本竹的不懈努力,万恶的360终于被我卸载掉了!!!想知道怎么卸载的评论区留言 好了不多废话,进入正题吧 先讲解上次留下…...
怎么在macromedia做网站/国外网站
如题,最近遇到一个奇怪的问题。vueroute第一次进去某个页面完全正常,第二次带不同的值进去,页面显示还是第一个页面的值,但是数据传进去了。第三次则显示第二次数值的页面。用了监听路由变化的方法下面是详细过程 这是页面的creat…...
做夺宝网站要办理什么/it培训班学出来有用吗
首先必须注意一般的.c文件和.h文件采用相同的函数名(如main.c和main.h定义) .c文件一般用于函数的实现,.h文件一般用于函数的声明 main.c内包含了所有用到的函数的头文件,实现函数的调用,从而完成函数的调用实现。 转载…...