当前位置: 首页 > news >正文

岛屿数量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++中,自动类型推导是通过autodecltype来实现的。这些关键字让程序员能够在不显式指定类型的情况下,依赖编译器自动推导出变量的类型

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::vectorstd::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;之后,dataother.data指向同一块内存。如果不释放原有的内存,就会导致内存泄漏,因为对象thisother都持有相同的资源指针,但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对象的资源转移给了thisother对象不再拥有该资源,因此将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 快速入门&#xff1a;全面了解与安装步骤 一、关于Git 1.1 简介 Git 是一个开源的分布式版本控制系统&#xff0c;由 Linus Torvalds 于 2005 年创建&#xff0c;最初是为了更好地管理 Linux 内核开发而设计。 Git用于跟踪计算机文件的变化&#xff0c;特别是源代码文件…...

基于域自适应的双光融合

目录 引言DAF-Net编码器-解码器分支编码器部分融合层解码器部分 域自适应层概述多核最大均值差异&#xff08;MK-MMD&#xff09;第一阶段&#xff1a;编码器-解码器分支训练训练过程损失函数 第二阶段&#xff1a;融合层训练训练过程损失函数 实验与结果总结 文章声明&#xf…...

迭代器模式 (Iterator Pattern)

文章目录 迭代器模式 (Iterator Pattern)原理优点缺点示例代码场景描述1. 定义迭代器接口2. 定义集合接口3. 实现具体集合类4. 客户端代码输出结果 UML 类图使用场景优化与扩展小结 迭代器模式 (Iterator Pattern) 迭代器模式是一种 行为型设计模式&#xff0c;用于顺序访问集…...

039集——渐变色之:CAD中画彩虹()(CAD—C#二次开发入门)

&#xff08;来左边儿 跟我一起画个龙&#xff0c;在你右边儿 画一道彩虹 ~~~~~~~~~~~ &#xff09; 效果如下&#xff1a; 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 私有仓库转换为公共仓库 在软件开发领域&#xff0c;GitHub 是一个广受欢迎的…...

C++11 右值引用

目录 左值 右值 左值引用与右值引用比较 左值引用总结&#xff1a; 右值引用总结&#xff1a; 左值引用的使用场景&#xff1a; 引用传参和做返回值都可以提高效率(减少拷贝) 左值引用的短板&#xff1a; 右值引用和移动语义解决上述问题&#xff1a; 下面就是有移动…...

WPS表格学习计划与策略

一、学习目标 掌握WPS表格的基本操作:包括新建、打开、保存工作簿,单元格的编辑与格式化,数据的输入与验证等。熟练运用WPS表格的数据处理功能:包括数据排序、筛选、分类汇总,以及使用公式和函数进行计算和分析。学会制作图表与数据可视化:掌握不同类型图表(如柱状图、折…...

Android 引入 proto 项目及使用方法

Proto&#xff08;Protocol Buffers&#xff09;是Google开发的一种语言无关、平台无关的序列化结构数据的方法&#xff0c;它类似于JSON和XML&#xff0c;但相对于XML而言更小&#xff0c;相对于JSON而言解析更快&#xff0c;支持多语言。以下是将Proto引入Android项目的方法及…...

VSOMEIP主要流程的时序

请求服务: client应用&#xff1a; ​ 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 的发展历程中&#xff0c;右值引用和移动语义的引入带来了显著的性能提升和编程灵活性。本文将深入探讨右值引用和移动语义的概念、用法以及重要性。 一、引言 C 作为一门高效的编程语言&#xff0c;一直在不断演进以满足现代软件编程的需求。…...

经纬高LLA转地心地固ECEF坐标,公式,代码

经纬高转地心地固的目的 坐标系转换是gis或者slam系统常见操作。GNSS获取的一般是经纬高&#xff0c;经纬高在slam系统里无法应用&#xff0c;slam系统一般是xyz互相垂直的笛卡尔坐标系&#xff0c;所以需要把GNSS的经纬高转到直角坐标系地心地固ECEF或者高斯投影GKP。 划重点…...

VUE前端实现天爱滑块验证码--详细教程

第一步&#xff1a; Git地址&#xff1a;tianai-captcha-demo: 滑块验证码demo 找到目录 src/main/resources/static,拷贝 static 并改名为 tac 即可。 第二步&#xff1a; 将改为 tac 的文件&#xff0c;放进项目根目录中&#xff0c;如下图&#xff1a; 第三步&#xff1…...

【链表】【删除节点】【刷题笔记】【灵神题单】

237.删除链表的节点 链表删除节点的本质是不用删除&#xff0c;只需要操作指针&#xff0c;跳过需要删除的节点&#xff0c;指向下下一个节点即可&#xff01; 删除某个节点&#xff0c;但是不知道这个节点的前一个节点&#xff0c;也不知道头节点&#xff01;摘自力扣评论区…...

springboot339javaweb的新能源充电系统pf(论文+源码)_kaic

毕 业 设 计&#xff08;论 文&#xff09; 题目&#xff1a;新能源充电系统的设计与实现 摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解…...

【嵌入式——QT】QT制作安装包

第一步 QT程序写好之后&#xff0c;编译release版本 第二步 拿到release生成的.exe文件 第三步 新建文件夹deploy 第四步 将.exe文件复制到deploy目录下 第五步 在该目录下输入cmd指令&#xff0c;回车 第六步 在打开的命令窗口下输入 windeployqt TegNetCom_1.0.…...

python的文件操作练习

文件操作&#xff1a;成绩统计 有一个文件grades.txt&#xff0c;文件内容是每行一个学生的成绩&#xff08;格式&#xff1a;姓名,成绩&#xff09;。要求&#xff1a; 读取文件内容&#xff0c;统计所有学生的平均成绩&#xff1b; 将不及格&#xff08;<60分&#xff09…...

jQuery九宫格抽奖,php处理抽奖信息

功能介绍 jQuery九宫格抽奖是一种基于jQuery库的前端抽奖效果。通过九宫格的形式展示抽奖项&#xff0c;用户点击抽奖按钮后&#xff0c;九宫格开始旋转&#xff0c;最终停在一个随机位置上&#xff0c;此位置对应的抽奖项为用户的中奖结果。 本文实现九宫格的步骤为&#xf…...

2024年一级建造师考试成绩,即将公布!

一级建造师考试成绩一般在考试结束后3个月左右的时间公布&#xff01; 根据官方通知&#xff0c;重庆、江苏、青海、江西、云南、湖南、福建、北京、山西、黑龙江等地在今年一建报名通知里提到&#xff1a;2024年一级建造师考试成绩预计于2024年12月上旬公布。考生可在这个时间…...

M4V 视频是一种什么格式?如何把 M4V 转为 MP4 格式?

M4V 是一种视频文件格式&#xff0c;主要由苹果公司用于其产品和服务中&#xff0c;如 iTunes Store 上的电影和电视节目。这种格式可以包含受版权保护的内容&#xff0c;并且通常与苹果的 DRM&#xff08;数字版权管理&#xff09;技术结合使用&#xff0c;以限制内容的复制和…...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业

6月9日&#xff0c;国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解&#xff0c;“超级…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

HBuilderX安装(uni-app和小程序开发)

下载HBuilderX 访问官方网站&#xff1a;https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本&#xff1a; Windows版&#xff08;推荐下载标准版&#xff09; Windows系统安装步骤 运行安装程序&#xff1a; 双击下载的.exe安装文件 如果出现安全提示&…...

Swagger和OpenApi的前世今生

Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章&#xff0c;二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑&#xff1a; &#x1f504; 一、起源与初创期&#xff1a;Swagger的诞生&#xff08;2010-2014&#xff09; 核心…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”

2025年#高考 将在近日拉开帷幕&#xff0c;#AI 监考一度冲上热搜。当AI深度融入高考&#xff0c;#时间同步 不再是辅助功能&#xff0c;而是决定AI监考系统成败的“生命线”。 AI亮相2025高考&#xff0c;40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕&#xff0c;江西、…...

JS设计模式(4):观察者模式

JS设计模式(4):观察者模式 一、引入 在开发中&#xff0c;我们经常会遇到这样的场景&#xff1a;一个对象的状态变化需要自动通知其他对象&#xff0c;比如&#xff1a; 电商平台中&#xff0c;商品库存变化时需要通知所有订阅该商品的用户&#xff1b;新闻网站中&#xff0…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行

项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战&#xff0c;克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...