力扣 岛屿数量-200
岛屿数量-200
class Solution {//深度优先搜索 dfs
public:int vis[300][300] = {0};//用于标记的数组,标记是否遍历过int cnt = 0;//岛屿计数//上下左右的移动方向数组int dx[4]={-1,1,0,0};int dy[4]={0,0,-1,1};//深度优先搜索void dfs(vector<vector<char>>& grid,int x,int y){for(int i=0;i<4;i++){int bx = x+dx[i];int by = y+dy[i];//检查边界if(bx<0||bx>=grid.size()||by<0||by>=grid[0].size())continue;//检查是否被标记过(已经遍历过),当前位置的值是否为1,被标记过或者值为1就跳过if(vis[bx][by]||grid[bx][by]!='1')continue;//标记当前点为已经访问vis[bx][by]=1;//递归搜索相邻的格子dfs(grid,bx,by);}}int numIslands(vector<vector<char>>& grid) {//遍历数组for(int i=0;i<grid.size();i++){for(int j=0;j<grid[0].size();j++){//如果没有被标记过(为0),并且值为'1'if(!vis[i][j]&&grid[i][j]=='1'){//岛屿计数加1cnt++;//当前元素标记为1表示已经访问过vis[i][j]=1;//深度优先搜索dfs(grid,i,j);}}}return cnt;}
};
每日问题
右值引用和移动语义
右值引用和移动语义
在 C++11 中,引入了 右值引用 和 移动语义 这两个重要概念,它们主要用于优化性能,减少不必要的资源拷贝,尤其是在处理大对象时。理解这两个概念有助于写出更加高效的 C++ 代码。
1. 右值和左值
在讨论右值引用之前,我们需要先理解 左值 和 右值 的区别:
- 左值 (Lvalue):指代内存中的某个位置,有持久性的,可以对其取地址。
- 示例:变量、数组元素、解引用的指针等。
- 例如:int a = 10; 中的 a 是左值。
- 右值 (Rvalue):临时的、没有持久性的数据,不能取地址。通常是表达式计算的结果、常量、临时对象等。
- 示例:a + b 或 func() 返回的临时对象。
- 例如:int x = a + b; 中的 a + b 是右值。
左值 和 右值 的区分在 C++11 中变得更加重要,特别是在涉及到 右值引用 和 移动语义 时。
2. 右值引用(&&)
右值引用(&&)是 C++11 引入的新特性,它用于捕获 右值。与传统的 左值引用(&) 不同,右值引用是用来绑定 右值 的,目的是为了解决不必要的拷贝操作和资源的浪费。
右值引用的特点:
- 右值引用只能绑定 右值,而不能绑定左值。
- 右值引用使得对象的资源(如内存、文件句柄等)能够被 转移(move),而不是复制(拷贝)。
右值引用的声明:
int&& r = 5; // 5 是右值,r 是右值引用
3. 移动语义
移动语义 允许资源从一个对象 转移(move) 到另一个对象,而不是复制资源。这通过右值引用实现,避免了昂贵的深拷贝操作,特别是在处理大型对象(如 std::vector、std::string)时,大大提高了性能。
关键概念:
- 移动构造函数:一个特殊的构造函数,它接收一个右值引用,并转移(而不是复制)其资源。
- 移动赋值运算符:与移动构造函数类似,它接收一个右值引用并转移资源。
例子:移动构造函数和移动赋值运算符
考虑一个自定义的类 MyClass,它管理一个动态分配的数组。我们希望能够利用 移动语义 来避免不必要的资源拷贝。
#include <iostream>
#include <cstring>class MyClass {
private:char* data;public:// 普通构造函数MyClass(const char* str) {data = new char[strlen(str) + 1];strcpy(data, str);std::cout << "Constructing: " << data << std::endl;}// 移动构造函数MyClass(MyClass&& other) noexcept {data = other.data; // 转移所有权other.data = nullptr; // 使其他对象处于有效的空状态std::cout << "Moving: " << data << std::endl;}// 移动赋值运算符MyClass& operator=(MyClass&& other) noexcept {if (this != &other) {delete[] data; // 删除原来的资源data = other.data; // 转移所有权other.data = nullptr; // 使其他对象处于有效的空状态}std::cout << "Move Assigning: " << data << std::endl;return *this;}// 析构函数~MyClass() {delete[] data;std::cout << "Destructing: " << (data ? data : "nullptr") << std::endl;}void print() const {std::cout << "Data: " << data << std::endl;}
};int main() {MyClass obj1("Hello, World!"); // 使用普通构造函数MyClass obj2 = std::move(obj1); // 使用移动构造函数obj2.print(); // 输出 obj2 的数据// obj1 不再持有有效数据,因为它的资源已被转移obj1.print(); // 输出 obj1 的数据(null)MyClass obj3("Temporary");obj3 = std::move(obj2); // 使用移动赋值运算符return 0;
}
输出:
Constructing: Hello, World!
Moving: Hello, World!
Data: Hello, World!
Destructing: nullptr
Move Assigning: Hello, World!
Destructing: Temporary
Destructing: Hello, World!
4. 为什么使用移动语义?
移动语义的主要优点在于,它允许将资源的所有权从一个对象转移到另一个对象,而不是进行昂贵的复制操作。
性能优化:
在没有移动语义的情况下,当一个对象被复制时,通常需要执行深拷贝操作,这可能会消耗大量时间,尤其是对于包含大量数据的对象(如 std::vector、std::string)。但是使用移动语义,数据的所有权被直接转移,避免了复制操作,从而提高了性能。
使用场景:
- 当一个对象的生命周期短,并且不再需要它时,可以将它的资源转移到另一个对象中。
- 当你返回一个临时对象时,移动语义能避免不必要的复制。
5. 右值引用与常规引用的区别
- 左值引用 (&):可以绑定到 左值,引用已经存在的对象。不能绑定到临时对象或常量。
- 右值引用 (&&):只能绑定到 右值,即临时对象、表达式的结果等。允许资源的转移,避免了深拷贝。
举个例子:
int a = 10;
int& lref = a; // 左值引用,绑定到左值 a
int&& rref = 20; // 右值引用,绑定到右值 20
6. 总结
- 右值引用 (&&) 允许我们捕获和操作 右值,为 移动语义 提供支持。
- 移动语义 允许我们将对象的资源从一个对象转移到另一个对象,避免了不必要的拷贝,从而提高了程序的性能。
- 移动构造函数 和 移动赋值运算符 是支持移动语义的核心,它们通过转移对象的资源来避免复制操作。
通过右值引用和移动语义,我们能够写出更高效、性能更好的 C++ 代码,尤其是在处理大型数据结构和容器时。
自动类型推导(auto 和 decltype)
自动类型推导:auto 和 decltype
在 C++ 中,auto 和 decltype 都是与类型推导相关的关键字,它们帮助程序员简化代码,避免手动指定冗长或复杂的类型。
1. auto 关键字
auto 是 C++11 引入的关键字,用来自动推导变量的类型。编译器根据变量的初始化表达式来推导变量的类型。
基本用法:
auto x = 10; // x 的类型是 int
auto y = 3.14; // y 的类型是 double
auto z = "hello"; // z 的类型是 const char*
用于函数返回类型:
auto 也可以用于函数的返回类型,特别是当返回类型较为复杂时,或者返回值的类型依赖于某些表达式的计算结果。
auto add(int a, int b) {return a + b; // 返回值的类型自动推导为 int
}
用于迭代器:
auto 在使用 STL 容器时特别有用,避免了繁琐的类型声明,尤其是迭代器类型的声明。
#include <vector>std::vector<int> vec = {1, 2, 3, 4, 5};
for (auto it = vec.begin(); it != vec.end(); ++it) {std::cout << *it << " "; // 自动推导 it 的类型
}
2. decltype 关键字
decltype 是 C++11 引入的另一个关键字,它的作用是查询表达式的类型。decltype 不会计算表达式的值,只会返回该表达式的类型。
基本用法:
int x = 10;
decltype(x) y = 20; // y 的类型与 x 相同,都是 intdouble z = 3.14;
decltype(z) w = 2.71; // w 的类型是 double
用于推导函数返回类型:
有时候,函数的返回类型可能很复杂(如模板函数),这时可以用 decltype 来推导返回类型,而无需手动指定。
template<typename T, typename U>
auto multiply(T a, U b) -> decltype(a * b) {return a * b; // 返回值的类型是 a * b 的类型
}
3. auto 和 decltype 的区别
auto:用于变量声明时,编译器根据初始化表达式来推导类型。适用于你知道变量的初始值,但不想显式写出类型时。
自动推导类型,适用于变量声明。
如果初始化表达式返回引用或常量,auto 会丢弃引用或常量。
decltype:用于获取任何表达式的类型,无论是否为引用、常量、指针等。适用于你想要查询某个表达式类型或返回类型时。
获取表达式的类型,不对类型进行推导。
如果表达式是一个引用类型,decltype 会保留这个引用。
举例说明两者的区别:
int x = 10;
int& ref = x;// auto 会推导为 int,因为初始化值是 `x`
auto a = x; // a 的类型是 int// decltype 会保留引用类型
decltype(ref) b = x; // b 的类型是 int&
4. 使用场景和最佳实践
使用 auto:
适用于复杂类型的变量声明,尤其是当类型很长或难以确定时。
减少代码重复和冗长,特别是在模板编程中。
迭代器类型、返回类型等都可以通过 auto 自动推导。
示例:
std::vector<int>::iterator it = vec.begin();
auto it2 = vec.begin(); // 自动推导类型
使用 decltype:
当你需要保持某个变量的类型,特别是引用类型时,decltype 是非常有用的。
用于函数返回类型推导,或者在模板编程中获取表达式类型。
示例:
decltype(x + y) result = x + y; // result 的类型与 x + y 相同
5. 组合使用:auto 和 decltype
这两个关键字可以结合使用,尤其是在模板编程或复杂类型的情况中非常有用。
示例:
template <typename T>
auto sum(T a, T b) -> decltype(a + b) {return a + b;
}
在这里,auto 用于返回类型,decltype 用于推导 a + b 的类型。
总结
auto 关键字用于变量声明时自动推导类型,简化代码,尤其在复杂类型或迭代器类型中非常有用。
decltype 用于查询表达式的类型,保持原始类型信息,适用于需要精确控制类型的场景。
auto 和 decltype 经常一起使用,帮助简化和增强代码的可读性与灵活性。
相关文章:
力扣 岛屿数量-200
岛屿数量-200 class Solution {//深度优先搜索 dfs public:int vis[300][300] {0};//用于标记的数组,标记是否遍历过int cnt 0;//岛屿计数//上下左右的移动方向数组int dx[4]{-1,1,0,0};int dy[4]{0,0,-1,1};//深度优先搜索void dfs(vector<vector<char>…...
极狐GitLab 17.6 正式发布几十项与 DevSecOps 相关的功能【三】
GitLab 是一个全球知名的一体化 DevOps 平台,很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版,专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料: 极狐GitLab 官网极狐…...
十二、正则表达式、元字符、替换修饰符、手势和对话框插件、字符串截取
1. 正则表达式 1.1 基本使用 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title&g…...
【信息系统项目管理师】第3章:信息系统治理 考点梳理
文章目录 3.1 IT 治理3.1.1 IT治理基础3.1.2 IT治理体系3.1.3 IT治理任务3.1.4 IT治理方法与标准 3.2 IT 审计3.2.1 IT审计基础3.2.2 审计方法与技术3.2.3 审计流程3.2.4 审计内容 3.1 IT 治理 IT治理起到重要的统筹、评估、指导和监督作用。 信息技术审计(IT审计)作为与IT治…...
实现对图片或者视频增加隐藏水印和提取水印
好久好久没有写博客了,最近看见一个很有意思的文章:小心你的电脑被窃听,就是说在一些公司,截图都会存在水印,方便溯源,然后出于技术的好奇,我在github上搜了一下,还真有相关的github…...
uniapp配置全局消息提醒
1.H5使用根标签插入dom的方式实现。 2.app端使用plus.nativeObj.View的方式绘制实现 H5端app端 H5端 创建组件orderAlert.vue <template><div class"view"><div class"content" v-if"visible"><div class"message&q…...
卸载snap docker一直卡住:Save data of snap “docker“ in automatic snapshot set #3
在卸载 Snap 安装的 Docker 时卡住,通常是因为 Snap 在执行卸载时会先尝试保存一些快照(自动或手动创建的),并且该过程可能因某些原因而卡住。为了解决这个问题,你可以按照以下步骤强制删除 Snap 安装的 Docker&#x…...
python学习——字典元素的访问和遍历
在Python中,访问和遍历字典元素的方法如下: 文章目录 访问字典元素1. 使用键来访问值2. 使用 get() 方法 遍历字典元素1. 遍历字典的键2. 遍历字典的值3. 遍历字典的键和值4. 使用列表推导式来创建新的列表 实操 访问字典元素 1. 使用键来访问值 # 创…...
数据结构基础之《(9)—归并排序》
一、什么是归并排序 1、整体是递归,左边排好序右边排好序merge让整体有序 2、让其整体有序的过程里用了排外序方法 3、利用master公式来求解时间复杂度 4、当然可以用非递归实现 二、归并排序说明 1、首先有一个f函数 void f(arr, L, R) 说明:在arr上…...
【深度学习】各种卷积—卷积、反卷积、空洞卷积、可分离卷积、分组卷积
在全连接神经网络中,每个神经元都和上一层的所有神经元彼此连接,这会导致网络的参数量非常大,难以实现复杂数据的处理。为了改善这种情况,卷积神经网络应运而生。 一、卷积 在信号处理中,卷积被定义为一个函数经过翻转…...
远程视频验证如何改变商业安全
如今,商业企业面临着无数的安全挑战。尽管企业的形态和规模各不相同——从餐厅、店面和办公楼到工业地产和购物中心——但诸如入室盗窃、盗窃、破坏和人身攻击等威胁让安全主管时刻保持警惕。 虽然传统的监控摄像头网络帮助组织扩大了其态势感知能力,但…...
电脑启动需要经历哪些过程?
传统BIOS启动流程 1. BIOS BIOS 启动,BIOS程序是烧进主板自带的ROM里的,所以无硬盘也可以启动。BIOS先进行自检,检查内存、显卡、磁盘等关键设备是否存在功能异常,会有蜂鸣器汇报错误,无错误自检飞快结束。 硬件自检…...
纯Go语言开发人脸检测、瞳孔/眼睛定位与面部特征检测插件-助力GoFly快速开发框架
前言 开发纯go插件的原因是因为目前 Go 生态系统中几乎所有现有的人脸检测解决方案都是纯粹绑定到一些 C/C 库,如 OpenCV 或 dlib,但通过 cgo 调用 C 程序会引入巨大的延迟,并在性能方面产生显著的权衡。…...
postman使用正则表达式提取数据实战篇!
之前篇章中postman多接口关联使用的是通过JSON提取器的方式进行提取。 除了JSON提取器提取数据外还可通过另一种方式——正则表达式来提取数据。 1、使用正则表达式提取器实现接口关联,match匹配 正则匹配表达式将需要提取的字段key:value都放入表达式中ÿ…...
ipmitool使用详解(三)-解决各种dell、hp服务器无法ipmitool连接问题
报错 [root@localhost ~]# ipmitool -H 10.1.2.41 -I lan -U admin -P "password123" lan print 1 Get Session Challenge command failed Error: Unable to establish LAN session Error: Unable to establish IPMI v1.5 / RMCP session [root@localhost ~]# ipmit…...
AWS EC2设置用户名密码登录
使用AWS EC2 设置用户名密码登录 步骤 1: 访问控制台 登录到AWS管理控制台。导航至 EC2 Dashboard。在左侧导航栏中选择 Instances。选择需要配置的实例。使用 EC2 Instance Connect 访问实例控制台。 步骤 2: 切换到 root 用户 打开终端或命令行工具,通过SSH连…...
BurpSuite安装教程(详细!!附带下载链接)
声明 学习内容来自 B 站UP主泷羽sec,如涉及侵权马上删除文章。 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负。 ✍🏻作者简介:致…...
MIPS寄存器文件设计实验
今天写MIPS寄存器文件设计实验,同时复习一下MIPS这块地方 实验要求: 一、寄存器的作用 想象一下,你正在厨房准备做一顿大餐。你需要用到各种食材和工具,比如刀、锅、砧板,还有食材本身,比如肉、菜、调料等…...
uniapp使用扩展组件uni-data-select出现的问题汇总
前言 不知道大家有没有学习过我的这门课程那,《uniCloud云开发Vue3版本官方推荐用法》,这么课程已经得到了官方推荐,想要快速上手unicloud的小伙伴们,可以学习一下这么课程哦,不要忘了给一键三连呀。 在录制这门课程…...
反向代理模块开发
1 概念 1.1 反向代理概念 反向代理是指以代理服务器来接收客户端的请求,然后将请求转发给内部网络上的服务器,将从服务器上得到的结果返回给客户端,此时代理服务器对外表现为一个反向代理服务器。 对于客户端来说,反向代理就相当于…...
海康面阵、线阵、读码器及3D相机接线说明
为帮助用户快速了解和配置海康系列设备的接线方式,本文将针对海康面阵相机、线阵相机、读码器和3D相机的主要接口及接线方法进行全面整理和说明。 一、海康面阵相机接线说明 海康面阵相机使用6-pin P7接口,其功能设计包括电源输入、光耦隔离信号输入输出…...
AI与ArcGIS Pro的地理空间分析和可视化
AI思维已经成为一种必备的能力,ArcGIS Pro3的卓越性能与ChatGPT的智能交互相结合,将会为您打造了一个全新的工作流程! 那么如何将火热的ChatGPT与ArcGIS Pro3相结合,使我们无需自己进行复杂的编程,通过强大的ChatGPT辅助我们完成地…...
详解HTML5语言
文章目录 前言任务一 认识HTML5任务描述:知识一 HTML5基础知识 任务二 HTML 5语义元素任务描述:知识一 HTML5新增结构元素知识二 HTML5文本语义元素 总结 前言 HTML5是一个新的网络标准,现在仍处于发展阶段。目标是取代现有的HTML 4.01和XHT…...
docker compose一键启动ES集群和kibana
集群启用了XPACK后,只有第一次可以启动成功。要是宕机了。就启动不了了。(除非删除data目录所有数据)生产环境 启用了后 建议配置 自定义证书。 services:es01:image: "docker.elastic.co/elasticsearch/elasticsearch:7.17.25"co…...
遗传算法与深度学习实战(25)——使用Keras构建卷积神经网络
遗传算法与深度学习实战(25)——使用Keras构建卷积神经网络 0. 前言1. 卷积神经网络基本概念1.1 卷积1.2 步幅1.3 填充1.4 激活函数1.5 池化 2. 使用 Keras 构建卷积神经网络3. CNN 层的问题4. 模型泛化小结系列链接 0. 前言 卷积神经网络 (Convolution…...
pytest+allure生成报告显示loading和404
pytestallure执行测试脚本后,通常会在电脑的磁盘上建立一个临时文件夹,里面存放allure测试报告,但是这个测试报告index.html文件单独去打开,却显示loading和404, 这个时候就要用一些办法来解决这个报告显示的问题了。 用命令产生…...
为何划分 Vue 项目结构组件?划分结构和组件解决了什么问题?为什么要这么做?
在一个大型 Vue 项目中,合理的目录结构和组件划分至关重要。良好的结构可以提高开发效率,减少维护成本,并使得团队合作更加顺畅。下面我将详细讲解如何在 Vue 项目中进行目录结构和组件划分,并结合实际项目代码示例进行说明。 1. 为什么要划分结构和组件? 1.1 提高可维护…...
springboot中使用mongodb完成评论功能
pom文件中引入 <!-- mongodb --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> yml中配置连接 data:mongodb:uri: mongodb://admin:1234561…...
Dubbo的RPC泛化调用
目录 一、RPC泛化调用的应用场景 二、Dubbo RPC泛化调用的实现原理 三、Dubbo RPC泛化调用的实现步骤 四、示例代码 五、泛化调用怎么发现提供该接口的服务及服务的IP和端口? Dubbo的RPC泛化调用是一种在调用方没有服务方提供的API的情况下,对服务方…...
【k8s深入理解之 Scheme】全面理解 Scheme 的注册机制、内外部版本、自动转换函数、默认填充函数、Options等机制
参考 【k8s基础篇】k8s scheme3 之序列化_基于schema进行序列化-CSDN博客【k8s基础篇】k8s scheme4 之资源数据结构与资源注册_kubernetes 的scheam-CSDN博客常见问题答疑 【k8s深入理解之 Scheme 补充-1】理解 Scheme 中资源的注册以及 GVK 和 go 结构体的映射-CSDN博客【k8s深…...
无锡装饰网站建设/如何优化网站推广
#!/bin/bash for file in *.zip dofolder$(echo $file | cut -c 1-10)mkdir $folderunzip -q $file -d $folder doneecho "All zip files have been extracted." # 说明: # 1. for循环遍历当前目录下的所有zip文件 # 2. 使用cut命令提取zip文件名前10个字…...
成都网站建设排行榜/软文推广媒体
转:http://zggcj.blog.163.com/blog/static/191275229201111822229703/ 请在MDK(keil)工程属性的“Target“-》”Code Generation“中勾 选”Use MicroLIB 前提是你有一个完整keil的工程 比如ADC的调试的时候很多时候用到串口 这里教你怎么样…...
统计网站怎么做/网站点击量与排名
参考blog: https://blog.csdn.net/Jason_M_Ho/article/details/78700434转载于:https://www.cnblogs.com/ft039x/p/9923743.html...
聊城wap网站制作/百度首页清爽版
设计模式 with Python 7:适配器模式 在本系列的前几篇文章中我提到过,设计模式事实上是编程领域的前辈为了解决某一类问题总结出来的通用解决方案,而编程这项工作其实本身也是为了用计算机语言来描述和解决某些现实问题,所以设计…...
一个网站做多有几种颜色/北京网站建设开发公司
摘要之前项目中整合Swagger都是直接通过依赖springfox-swagger、springfox-swagger-ui两个jar包来实现的,最近发现springfox 3.0.0版本已经有了自己的SpringBoot Starter,使用起来更契合SpringBoot项目,非常方便,推荐给大家&#…...
建设个定制网站需要多少钱/google网站推广
目录 一、导图 二、RCE漏洞简介 三、代码执行漏洞示例 四、命令执行漏洞示例 五、漏洞的产生条件 <网站原码层面> <网站应用层面> 六、漏洞检测 七、黑盒-应用层面-漏洞实例 八、白盒-代码层面-漏洞实例 九、黑盒-RCE公开漏洞-漏洞实例 十、漏洞产生的…...