C++学习:六个月从基础到就业——C++17:if/switch初始化语句
C++学习:六个月从基础到就业——C++17:if/switch初始化语句
本文是我C++学习之旅系列的第四十六篇技术文章,也是第三阶段"现代C++特性"的第八篇,主要介绍C++17引入的if和switch语句的初始化表达式特性。查看完整系列目录了解更多内容。
引言
C++17引入了一项看似简单却非常实用的语法特性:if和switch语句的初始化表达式。这一特性允许我们在条件判断语句的同一语句中声明和初始化变量,然后在条件表达式和语句体中使用这些变量。
虽然这个改进初看起来只是一个小的语法糖,但它能有效解决几个常见的编程问题:更好地控制变量作用域、减少代码嵌套、提高代码的可读性和减少错误。在本文中,我们将探讨这个新特性如何帮助我们编写更加简洁、更加安全的代码。
目录
- C++17:if/switch初始化语句
- 引言
- 目录
- 基本语法和概念
- if语句初始化
- switch语句初始化
- 与传统写法的对比
- 实际应用场景
- 资源管理
- 错误处理
- 迭代和查找
- 临时变量控制
- 与其他C++17特性结合
- 与结构化绑定结合
- 与optional结合
- 与lambda表达式结合
- 最佳实践与注意事项
- 变量作用域控制
- 代码可读性考虑
- 避免过度使用
- 总结
基本语法和概念
if语句初始化
C++17引入的if语句初始化语法允许我们在条件判断前添加一个初始化语句:
if (初始化语句; 条件表达式) {// 如果条件为真,执行此代码块
} else {// 如果条件为假,执行此代码块
}
一个简单的例子:
#include <iostream>
#include <vector>int main() {// 传统方式std::vector<int> values = {1, 2, 3, 4, 5};auto it = values.begin();if (it != values.end()) {std::cout << "First element: " << *it << std::endl;}// C++17方式if (auto it = values.begin(); it != values.end()) {std::cout << "First element with init-statement: " << *it << std::endl;}// it在这里已经超出作用域return 0;
}
这个特性的关键优势在于,变量it
的作用域被限制在if语句内部,避免了可能的变量泄漏和重用错误。
switch语句初始化
类似地,switch语句也支持初始化表达式:
switch (初始化语句; 条件表达式) {case 值1:// 代码块1break;case 值2:// 代码块2break;default:// 默认代码块
}
示例:
#include <iostream>
#include <string>enum class ErrorCode { SUCCESS, FILE_NOT_FOUND, PERMISSION_DENIED, UNKNOWN };ErrorCode openFile(const std::string& filename) {// 模拟文件操作if (filename == "nonexistent.txt") return ErrorCode::FILE_NOT_FOUND;if (filename == "restricted.txt") return ErrorCode::PERMISSION_DENIED;return ErrorCode::SUCCESS;
}int main() {// C++17方式switch (ErrorCode result = openFile("restricted.txt"); result) {case ErrorCode::SUCCESS:std::cout << "文件成功打开" << std::endl;break;case ErrorCode::FILE_NOT_FOUND:std::cout << "文件未找到" << std::endl;break;case ErrorCode::PERMISSION_DENIED:std::cout << "权限被拒绝" << std::endl;break;default:std::cout << "未知错误" << std::endl;}// result在这里已经超出作用域return 0;
}
与传统写法的对比
让我们比较传统写法和使用初始化语句的新写法:
// 传统写法1:变量作用域过大
int value = calculateValue();
if (value > 0) {useValue(value);
}
// value仍在作用域内,可能被误用// 传统写法2:使用额外的代码块限制作用域
{int value = calculateValue();if (value > 0) {useValue(value);}
} // value的作用域结束// C++17写法:简洁且安全
if (int value = calculateValue(); value > 0) {useValue(value);
} // value的作用域结束
新语法的优势:
- 变量的作用域被严格限制
- 代码更加简洁
- 初始化和条件检查紧密关联
- 减少嵌套层次
实际应用场景
资源管理
if初始化语句在资源管理中非常有用:
#include <iostream>
#include <fstream>
#include <string>void processFile(const std::string& filename) {// 优雅地处理文件资源if (std::ifstream file(filename); file.is_open()) {std::string line;while (std::getline(file, line)) {std::cout << line << std::endl;}} else {std::cout << "无法打开文件: " << filename << std::endl;}// file自动关闭,作用域受限
}
这种方式确保了文件资源在不再需要时立即释放,代码也更加整洁。
错误处理
初始化语句简化了错误处理逻辑:
#include <iostream>
#include <map>
#include <string>struct Result {bool success;std::string error_message;int value;
};Result performOperation() {// 模拟一个可能失败的操作return {false, "操作失败", 0};
}int main() {// 简洁地处理错误if (Result result = performOperation(); !result.success) {std::cout << "错误: " << result.error_message << std::endl;return 1;} else {std::cout << "成功,结果值: " << result.value << std::endl;}// 清晰地处理查找结果std::map<std::string, int> ages = {{"Alice", 30}, {"Bob", 25}};if (auto it = ages.find("Charlie"); it != ages.end()) {std::cout << "Charlie的年龄: " << it->second << std::endl;} else {std::cout << "找不到Charlie" << std::endl;}return 0;
}
迭代和查找
初始化语句在迭代和查找操作中特别有用:
#include <iostream>
#include <vector>
#include <algorithm>int main() {std::vector<int> numbers = {1, 3, 5, 7, 9, 2, 4, 6, 8};// 查找第一个偶数if (auto it = std::find_if(numbers.begin(), numbers.end(), [](int n) { return n % 2 == 0; });it != numbers.end()) {std::cout << "找到第一个偶数: " << *it << std::endl;std::cout << "位置: " << std::distance(numbers.begin(), it) << std::endl;} else {std::cout << "没有找到偶数" << std::endl;}// 条件查找和处理int searchValue = 7;if (auto it = std::find(numbers.begin(), numbers.end(), searchValue); it != numbers.end()) {*it = 70; // 修改找到的元素std::cout << "找到并修改了值" << std::endl;}return 0;
}
临时变量控制
初始化语句使临时变量的管理更加简单:
#include <iostream>
#include <string>
#include <ctime>std::string getCurrentTimeStr() {std::time_t now = std::time(nullptr);return std::ctime(&now);
}int main() {// 在if语句中使用临时变量并控制其作用域if (std::string timeStr = getCurrentTimeStr(); !timeStr.empty()) {std::cout << "当前时间: " << timeStr;}// timeStr在这里已不可访问// 比较两个临时计算结果if (int a = 5 * 5, b = 3 * 9; a > b) {std::cout << a << " 大于 " << b << std::endl;} else {std::cout << a << " 不大于 " << b << std::endl;}return 0;
}
注意在初始化语句中,可以使用逗号分隔多个变量声明。
与其他C++17特性结合
与结构化绑定结合
if/switch初始化语句与结构化绑定结合使用特别强大:
#include <iostream>
#include <map>
#include <string>int main() {std::map<std::string, int> scores = {{"Alice", 95},{"Bob", 87},{"Charlie", 92}};// 结合结构化绑定和if初始化语句if (auto [iter, inserted] = scores.insert({"David", 88}); inserted) {std::cout << "添加新记录: " << iter->first << " = " << iter->second << std::endl;} else {std::cout << "记录已存在: " << iter->first << " = " << iter->second << std::endl;}// 在map查找中使用结构化绑定if (auto it = scores.find("Bob"); it != scores.end()) {auto& [name, score] = *it;std::cout << name << "的分数: " << score << std::endl;score += 5; // 修改分数std::cout << "调整后的分数: " << score << std::endl;}return 0;
}
与optional结合
C++17引入的std::optional
与初始化语句配合使用效果很好:
#include <iostream>
#include <optional>
#include <string>std::optional<std::string> getUserName(int userId) {// 模拟用户查询if (userId == 1) return "Admin";if (userId == 2) return "Guest";return std::nullopt; // 没有找到用户
}int main() {// 使用初始化语句处理optional返回值if (auto name = getUserName(1); name.has_value()) {std::cout << "找到用户: " << *name << std::endl;} else {std::cout << "用户不存在" << std::endl;}// 更简洁的写法if (auto name = getUserName(3); name) {std::cout << "找到用户: " << *name << std::endl;} else {std::cout << "用户不存在" << std::endl;}return 0;
}
与lambda表达式结合
初始化语句也可以与lambda表达式结合使用:
#include <iostream>
#include <vector>
#include <numeric>int main() {std::vector<int> data = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};// 在初始化语句中定义并使用lambdaif (auto sum = [](const auto& container) {return std::accumulate(container.begin(), container.end(), 0);}; sum(data) > 50) {std::cout << "数组元素总和 > 50" << std::endl;} else {std::cout << "数组元素总和 <= 50" << std::endl;}// 在switch初始化中使用lambdaswitch (auto count = [&data]() {return std::count_if(data.begin(), data.end(), [](int n) { return n % 2 == 0; });}(); count) {case 0:std::cout << "没有偶数" << std::endl;break;case 5:std::cout << "正好一半是偶数" << std::endl;break;default:std::cout << "有 " << count << " 个偶数" << std::endl;}return 0;
}
最佳实践与注意事项
变量作用域控制
使用初始化语句的主要优势是精确控制变量的作用域,减少变量泄漏:
// 不好的做法:变量作用域过大
auto resource = acquireResource();
if (resource) {useResource(resource);
}
// resource仍然可见,可能被错误地再次使用// 好的做法:变量作用域受限
if (auto resource = acquireResource(); resource) {useResource(resource);
}
// resource不再可见
更复杂的例子,展示如何避免作用域泄漏:
#include <iostream>
#include <mutex>
#include <thread>std::mutex dataMutex;
int sharedData = 0;void processSharedData() {// 不好的做法:锁的作用域过大std::lock_guard<std::mutex> lock(dataMutex);if (sharedData > 0) {// 处理数据...sharedData++;}// 锁在这里仍然持有,即使已经不需要了// 好的做法:锁的作用域受限if (std::lock_guard<std::mutex> lock(dataMutex); sharedData > 0) {// 处理数据...sharedData++;}// 锁在这里已经释放// 更多不需要锁的工作...
}
代码可读性考虑
使用初始化语句可以使代码更加扁平,减少嵌套:
// 嵌套较深的传统写法
void processInput(const std::string& input) {int value;try {value = std::stoi(input);if (value > 0) {if (value < 100) {// 处理value...} else {std::cout << "值太大" << std::endl;}} else {std::cout << "值必须为正" << std::endl;}} catch (const std::exception& e) {std::cout << "转换错误: " << e.what() << std::endl;}
}// 使用初始化语句的扁平写法
void processInputFlat(const std::string& input) {try {if (int value = std::stoi(input); value <= 0) {std::cout << "值必须为正" << std::endl;} else if (value >= 100) {std::cout << "值太大" << std::endl;} else {// 处理value...}} catch (const std::exception& e) {std::cout << "转换错误: " << e.what() << std::endl;}
}
避免过度使用
虽然初始化语句很有用,但过度使用可能降低代码可读性:
// 过度使用的例子
if (auto x = getX(); x > 0) {if (auto y = computeY(x); y < threshold) {if (auto z = transformZ(y); isValid(z)) {// 嵌套的初始化语句可能难以理解}}
}// 更好的替代方式
auto x = getX();
if (x <= 0) return;auto y = computeY(x);
if (y >= threshold) return;auto z = transformZ(y);
if (isValid(z)) {// 处理有效的z
}
在某些情况下,显式的早期返回或传统变量声明可能更加清晰。
总结
C++17引入的if和switch语句初始化表达式是一项看似简单但非常实用的语法改进。它解决了变量作用域控制的痛点,使代码更简洁、更安全,并与其他C++17特性(如结构化绑定)协同工作得非常好。
主要优势包括:
- 精确控制变量作用域,减少变量泄漏和相关错误
- 简化临时变量的管理,使代码更加清晰
- 减少嵌套层次,使代码结构更加扁平
- 与其他C++17特性无缝集成,增强语言的表达能力
这个特性适用于许多实际场景,包括资源管理、错误处理、查找操作和临时变量控制等。在现代C++编程中,它已成为提高代码质量的重要工具。
与所有语言特性一样,初始化语句应谨慎使用,在提高代码清晰度的地方使用,避免过度复杂化。掌握这一特性及其最佳实践,将帮助你编写更加现代、高效、可维护的C++代码。
这是我C++学习之旅系列的第四十六篇技术文章。查看完整系列目录了解更多内容。
相关文章:
C++学习:六个月从基础到就业——C++17:if/switch初始化语句
C学习:六个月从基础到就业——C17:if/switch初始化语句 本文是我C学习之旅系列的第四十六篇技术文章,也是第三阶段"现代C特性"的第八篇,主要介绍C17引入的if和switch语句的初始化表达式特性。查看完整系列目录了解更多内…...
C++跨平台开发经验与解决方案
在当今软件开发领域,跨平台开发已成为一个重要的需求。C作为一种强大的系统级编程语言,在跨平台开发中扮演着重要角色。本文将分享在实际项目中的跨平台开发经验和解决方案。 1. 构建系统选择 CMake的优势 跨平台兼容性好 支持多种编译器和IDE 强大…...
RabbitMQ 工作模式(上)
前言 在 RabbitMQ 中,一共有七种工作模式,我们也可以打开官网了解: 本章我们先介绍前三种工作模式 (Simple)简单模式 P:producer 生产者,负责发送消息 C:consumer 消费者&#x…...
为什么需要加密机服务?
前言 大家好,我是老马。 以前我自己在写工具的时候,都是直接自己实现就完事了。 但是在大公司,或者说随着合规监管的要求,自己随手写的加解密之类的,严格说是不合规的。 作为一家技术性公司,特别是金融…...
【Linux】利用多路转接epoll机制、ET模式,基于Reactor设计模式实现
📚 博主的专栏 🐧 Linux | 🖥️ C | 📊 数据结构 | 💡C 算法 | 🅒 C 语言 | 🌐 计算机网络 上篇文章:多路转接epoll,实现echoserver 至此,Linux与…...
c/c++的findcontours崩溃解决方案
解决 Windows 平台 OpenCV findContours 崩溃:一种更稳定的方法 许多在 Windows 平台上使用 OpenCV 的开发者可能会在使用 findContours 函数时,遇到令人头疼的程序崩溃问题。尽管网络上流传着多种解决方案,但它们并非总能根治此问题。 当时…...
机器学习 Day18 Support Vector Machine ——最优美的机器学习算法
1.问题导入: 2.SVM定义和一些最优化理论 2.1SVM中的定义 2.1.1 定义 SVM 定义:SVM(Support Vector Machine,支持向量机)核心是寻找超平面将样本分成两类且间隔最大 。它功能多样,可用于线性或非线性分类…...
npm与pnpm--为什么推荐pnpm
包管理器中 npm是最经典的,但大家都任意忽略一个更优质的管理器:pnpm 1. 核心区别 特性npmpnpm依赖存储方式扁平化结构(可能重复依赖)硬链接 符号链接(共享依赖,节省空间)安装速度较慢&#…...
ollama调用千问2.5-vl视频图片UI界面小程序分享
1、问题描述: ollama调用千问2.5-vl视频图片内容,通常用命令行工具不方便,于是做了一个python UI界面与大家分享。需要提前安装ollama,并下载千问qwen2.5vl:7b 模型,在ollama官网即可下载。 (8G-6G 显卡可…...
济南国网数字化培训班学习笔记-第三组-1-电力通信传输网认知
电力通信传输网认知 电力通信基本情况 传输介质 传输介质类型(导引与非导引) 导引传输介质,如电缆、光纤; 非导引传输介质,如无线电波; 传输介质的选择影响信号传输质量 信号传输模式(单工…...
Kubernetes控制平面组件:Kubelet详解(六):pod sandbox(pause)容器
云原生学习路线导航页(持续更新中) kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计(一)Kubernetes架构原则和对象设计(二)Kubernetes架构原则和对象设计(三)Kubernetes控…...
51单片机,两路倒计时,LCD1602 ,Proteus仿真
初始上电 默认2路都是0分钟的倒计时 8个按键 4个一组 一组控制一路倒计时 4个 按键:加 减 开始或者暂停 复位到0分钟相当于停止 针对第一路倒计时 4个 按键2:加 减 开始或者暂停 复位到0分钟相当于停止 针对第2路倒计时 哪一路到了0后蜂鸣器响 对应LED点亮 main.c 文件实现了…...
MySQL之储存引擎和视图
一、储存引擎 基本介绍: 1、MySQL的表类型由储存引擎(Storage Engines)决定,主要包括MyISAM、innoDB、Memory等。 2、MySQL数据表主要支持六种类型,分别是:CSV、Memory、ARCHIVE、MRG_MYISAN、MYISAM、InnoBDB。 3、这六种又分…...
写spark程序数据计算( 数据库的计算,求和,汇总之类的)连接mysql数据库,写入计算结果
1. 添加依赖 在项目的 pom.xml(Maven)中添加以下依赖: xml <!-- Spark SQL --> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-sql_2.12</artifactId> <version>3.3.0…...
一:操作系统之系统调用
系统调用:用户程序与操作系统交互的桥梁 在计算机的世界里,应用程序是我们日常接触最多的部分,比如浏览器、文本编辑器、游戏等等。然而,这些应用程序并不能直接控制硬件资源,比如读写硬盘、创建新进程、发送网络数据…...
【ROS2】 核心概念6——通信接口语法(Interfaces)
古月21讲/2.6_通信接口 官方文档:Interfaces — ROS 2 Documentation: Humble documentation 官方接口代码实战:https://docs.ros.org/en/humble/Tutorials/Beginner-Client-Libraries/Single-Package-Define-And-Use-Interface.html ROS 2使用简化的描…...
SmartETL函数式组件的设计与应用
SmartETL框架主要采用了面向对象的设计思想,将ETL过程中的处理逻辑抽象为Loader和Processor(对应loader模块和iterator模块),所有流程组件需要继承或实现DataProvider(iter方法)或JsonIterator(…...
Spring Security与SaToken的对比与优缺点分析
Spring Security与SaToken对比分析 一、框架定位 Spring Security 企业级安全解决方案,深度集成Spring生态提供完整的安全控制链(认证、授权、会话管理、攻击防护)适合中大型分布式系统 SaToken 轻量级权限认证框架,专注Token会…...
|从零开始的Pyside2界面编程| 环境搭建以及第一个ui界面
🐑 |从零开始的Pyside2界面编程| 环境搭建以及第一个ui界面🐑 文章目录 🐑 |从零开始的Pyside2界面编程| 环境搭建以及第一个ui界面🐑♈前言♈♈Pyside2环境搭建♈♈做个简单的UI界面♈♒代码实现♒♒QTdesigner设计UI界面♒ ♒总…...
【爬虫】DrissionPage-7
官方文档: https://www.drissionpage.cn/browser_control/get_page_info/ 1. 页面信息 📌 html 描述:返回当前页面的 HTML 文本。注意:不包含 <iframe> 元素的内容。返回类型:str 示例: html_co…...
系统架构设计(十二):统一过程模型(RUP)
简介 RUP 是由 IBM Rational 公司提出的一种 面向对象的软件工程过程模型,以 UML 为建模语言,是一种 以用例为驱动、以架构为中心、迭代式、增量开发的过程模型。 三大特征 特征说明以用例为驱动(Use Case Driven)需求分析和测…...
深入解析Java事件监听机制与应用
Java事件监听机制详解 一、事件监听模型组成 事件源(Event Source) 产生事件的对象(如按钮、文本框等组件) 事件对象(Event Object) 封装事件信息的对象(如ActionEvent包含事件源信息…...
QT聊天项目DAY11
1. 验证码服务 1.1 用npm安装redis npm install redis 1.2 修改config.json配置文件 1.3 新建redis.js const config_module require(./config) const Redis require("ioredis");// 创建Redis客户端实例 const RedisCli new Redis({host: config_module.redis_…...
Python训练营---Day29
知识点回顾 类的装饰器装饰器思想的进一步理解:外部修改、动态类方法的定义:内部定义和外部定义 作业:复习类和函数的知识点,写下自己过去29天的学习心得,如对函数和类的理解,对python这门工具的理解等&…...
Flask-SQLAlchemy_数据库配置
1、基本概念(SQLAlchemy与Flask-SQLAlchemy) SQLAlchemy 是 Python 生态中最具影响力的 ORM(对象关系映射)库,其设计理念强调 “框架无关性”,支持在各类 Python 项目中独立使用,包括 Flask、D…...
世界银行数字经济指标(1990-2022年)-社科数据
世界银行数字经济指标(1990-2022年)-社科数据https://download.csdn.net/download/paofuluolijiang/90623839 https://download.csdn.net/download/paofuluolijiang/90623839 此数据集涵盖了1990年至2022年间全球各国的数字经济核心指标,数据…...
Redis进阶知识
Redis 1.事务2. 主从复制2.1 如何启动多个Redis服务器2.2 监控主从节点的状态2.3 断开主从复制关系2.4 额外注意2.5拓扑结构2.6 复制过程2.6.1 数据同步 3.哨兵选举原理注意事项 4.集群4.1 数据分片算法4.2 故障检测 5. 缓存5.1 缓存问题 6. 分布式锁 1.事务 Redis的事务只能保…...
NY337NY340美光固态颗粒NC010NC012
NY337NY340美光固态颗粒NC010NC012 在存储技术的浩瀚星空中,美光的NY337、NY340、NC010、NC012等固态颗粒宛如璀璨星辰,闪耀着独特的光芒。它们承载着先进技术与无限潜力,正深刻影响着存储行业的格局与发展。 一、技术架构与核心优势 美光…...
DAY26 函数定义与参数
浙大疏锦行-CSDN博客 知识点回顾: 1.函数的定义 2.变量作用域:局部变量和全局变量 3.函数的参数类型:位置参数、默认参数、不定参数 4.传递参数的手段:关键词参数 5.传递参数的顺序:同时出现三种参数类型时 函数的定义…...
系统安全及应用
目录 一、账号安全控制 1.基本安全措施 (1)系统账号清理 (2)密码安全控制 (3)历史命令,自动注销 2.用户提权和切换命令 2.1 su命令用法 2.2 sudo命令提权 2.3通过是sudo执行特权命令 二、系统引导和登录控制…...
微信小程序 地图 使用 射线法 判断目标点是否在多边形内部(可用于判断当前位置是否在某个区域内部)
目录 射线法原理简要逻辑代码 小程序代码调试基础库小程序配置地图数据地图多边形点与多边形关系 射线法 原理 使用射线法来判断,目标点是否在多边形内部 这里简单说下,具体细节可以看这篇文章 平面几何:判断点是否在多边形内(…...
第三十七节:视频处理-视频读取与处理
引言:解码视觉世界的动态密码 在数字化浪潮席卷全球的今天,视频已成为信息传递的主要载体。从短视频平台的爆火到自动驾驶的视觉感知,视频处理技术正在重塑人类与数字世界的交互方式。本指南将深入探讨视频处理的核心技术,通过Python与OpenCV的实战演示,为您揭开动态影像…...
什么是 Flink Pattern
在 Apache Flink 中,Pattern 是 Flink CEP(Complex Event Processing)模块 的核心概念之一。它用于定义你希望从数据流中检测出的 事件序列模式(Event Sequence Pattern)。 🎯 一、什么是 Flink Pattern&am…...
ADB基本操作和命令
1.ADB的含义 adb 命令是 Android 官方提供,调试 Android 系统的工具。 adb 全称为 Android Debug Bridge(Android 调试桥),是 Android SDK 中提供的用于管理 Android 模拟器或真机的工具。 adb 是一种功能强大的命令行工具&#x…...
NSString的三种实现方式
oc里的NSString有三种实现方式,为_ _NSCFConstantString、__NSCFString、NSTaggedPointerString 1._ _NSCFConstantString(字面量字符串) 从字面意思上可以看出,_ _NSCFContantString可以理解为常量字符串,这种类型的字符串在编译期就确定了…...
2025年PMP 学习二十 第13章 项目相关方管理
第13章 项目相关方管理 序号过程过程组过程组1识别相关方启动2规划相关方管理规划3管理相关方参与与执行4监控相关方参与与监控 相关方管理,针对于团队之外的相关方的,核心目标是让对方为了支持项目,以达到项目目标。 文章目录 第13章 项目相…...
学习黑客Kerberos深入浅出:安全王国的门票系统
Kerberos深入浅出:安全王国的门票系统 🎫 作者: 海尔辛 | 发布时间: 2025-05-18 🔑 理解Kerberos:为什么它如此重要? Kerberos是现代网络环境中最广泛使用的身份验证协议之一,尤其在Windows Active Dire…...
蓝桥杯19681 01背包
问题描述 有 N 件物品和一个体积为 M 的背包。第 i 个物品的体积为 vi,价值为 wi。每件物品只能使用一次。 请问可以通过什么样的方式选择物品,使得物品总体积不超过 M 的情况下总价值最大,输出这个最大价值即可。 输入格式 第一行输…...
使用 Auto-Keras 进行自动化机器学习
使用 Auto-Keras 进行自动化机器学习 了解自动化机器学习以及如何使用 auto-keras 完成它。如今,机器学习并不是一个非常罕见的术语,因为像 DataCamp、Coursera、Udacity 等组织一直在努力提高他们的效率和灵活性,以便将机器学习的教育带给普…...
算法刷题Day9 5.18:leetcode定长滑动窗口3道题,结束定长滑动窗口,用时1h
12. 1852.每个子数组的数字种类数 1852. 每个子数组的数字种类数 - 力扣(LeetCode) 思想 找到nums 所有 长度为 k 的子数组中 不同 元素的数量。 返回一个数组 ans,其中 ans[i] 是对于每个索引 0 < i < n - k,nums[i..(i …...
Protect Your Digital Privacy: Obfuscate, Don’t Hide
Protect Your Digital Privacy: Obfuscate, Don’t Hide In today’s digital world, hiding completely online is nearly impossible. But you can protect yourself by deliberately obfuscating your personal information — making it harder for others to track, pro…...
Spark 的运行模式(--master) 和 部署方式(--deploy-mode)
Spark 的 运行模式(--master) 和 部署方式(--deploy-mode),两者的核心区别在于 资源调度范围 和 Driver 进程的位置。 一、核心概念对比 维度--master(运行模式)--deploy-mode(部署…...
从零开始实现大语言模型(十五):并行计算与分布式机器学习
1. 前言 并行计算与分布式机器学习是一种使用多机多卡加速大规模深度神经网络训练过程,以减少训练时间的方法。在工业界的训练大语言模型实践中,通常会使用并行计算与分布式机器学习方法来减少训练大语言模型所需的钟表时间。 本文介绍PyTorch中的一种…...
生产模式下react项目报错minified react error #130的问题
这天,线上突然出现了一个bug,某个页面打开空白,看控制台报错minified react error #130,在本地看却是正常的,百思不得其解。 后来发现是由于线上项目它的包更新过了,而我本地的包没有更新,所以我…...
本地无损放大软件-realesrgan-gui
—————【下 载 地 址】——————— 【本章下载一】:https://drive.uc.cn/s/84516041df174 【本章下载二】:https://pan.xunlei.com/s/VOQDybD4ruF0-m8UJrCF-HtLA1?pwdxz9e# 【百款黑科技】:https://ucnygalh6wle.feishu.cn/wiki/…...
Java面试深度解析:微服务与云原生技术应用场景详解
Java面试深度解析:微服务与云原生技术应用场景详解 面试场景 面试官:我们今天的面试会围绕微服务与云原生技术展开,结合一个在线教育平台的业务场景进行提问。希望你放松心态,正常发挥。 码农明哥:好的好的…...
短剧小程序系统开发源码上架,短剧项目市场分析
引言 随着短视频内容消费的爆发式增长,短剧小程序凭借其碎片化、强互动、低成本的特点,成为内容创业与资本布局的新风口。2024年以来,行业规模突破500亿元,预计2027年将超千亿17。本文将深度解析短剧小程序系统开发的技术优势、市…...
常见的请求头(Request Header)参数
1. Accept 作用:告知服务器客户端支持的响应数据格式(如 JSON、XML、HTML)。示例:Accept: application/json(优先接收 JSON 格式数据)。 2. Content-Type 作用:说明请求体的数据格式(…...
渗透测试核心技术:内网渗透与横向移动
内网渗透是红队行动的关键阶段,攻击者通过突破边界进入内网后,需快速定位域控、横向移动并维持权限。本节从内网环境搭建、信息收集、横向移动技巧到权限维持工具,系统讲解如何在内网中隐蔽行动并扩大战果。 1. 内网环境搭建与基础配置 目标: 模拟真实企业网络,构建包含…...
2025/5/18
继续研究一下大佬的RAG项目。开始我的碎碎念。 RAG可以分成两部分:一个是问答,一个是数据处理。 问答是人提问,然后查数据库,把查的东西用大模型组织成人话,回答人的提问。 数据处理是把当下知识库里的东西…...