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

C++23 views::zip 和 views::zip_transform (P2321R2) 深入解析

文章目录

    • 一、引言
    • 二、C++23与Ranges库背景知识
      • 2.1 C++23概述
      • 2.2 Ranges库回顾
    • 三、`views::zip` 详解
      • 3.1 功能与定义
      • 3.2 使用场景
      • 3.3 示例代码
    • 四、`views::zip_transform` 详解
      • 4.1 功能与定义
      • 4.2 使用场景
      • 4.3 示例代码
    • 五、`views::zip` 与 `views::zip_transform` 的对比
      • 5.1 功能差异
      • 5.2 使用场景差异
      • 5.3 代码复杂度差异
    • 六、总结

一、引言

在C++的发展历程中,每一个新版本都会带来一系列令人期待的新特性,这些特性不仅提升了语言的性能和表达能力,还为开发者提供了更加便捷和高效的编程方式。C++23作为C++标准的一个重要版本,引入了许多实用的特性,其中 views::zipviews::zip_transform (提案编号P2321R2)就是两个非常有价值的特性,它们与C++20引入的Ranges库紧密相关,为处理范围数据提供了新的视角和方法。

二、C++23与Ranges库背景知识

2.1 C++23概述

C++23是C++标准的下一个重要更新版本,虽然不如C++20那样具有颠覆性,但它依然带来了许多值得开发者关注的改进和新增特性。C++23在C++20的基础上进行了补充和优化,解决了一些细节问题,并引入了新的编程工具和方法,旨在进一步提升C++语言的功能和开发效率。

2.2 Ranges库回顾

C++20引入的Ranges库是一个重要特性,它彻底改变了我们处理序列数据的方式,提供了更富有表现力、更易组合的抽象。简单来说,Range就是一种可以遍历的序列,你可以把它想象成更智能、更灵活的数组或者容器。C++20引入了Ranges这个概念,让我们可以更方便地操作这些序列,例如,可以使用Ranges来过滤、转换、拼接序列等。

std::views 是C++20里提供的一系列工具函数,用来对序列进行各种变换。它可以帮助我们以一种非常直观的方式对序列进行操作,比如过滤、转换、切片等等。以下是一个简单的示例,展示了如何使用 std::views 来过滤出数组中的偶数,并将这些偶数加倍:

#include <iostream>
#include <vector>
#include <ranges>int main() {std::vector<int> numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};auto result = numbers | std::views::filter([](int n) { return n % 2 == 0; })| std::views::transform([](int n) { return n * 2; });for (int n : result) {std::cout << n << ' ';}return 0;
}

在这个示例中,我们使用 std::views::filterstd::views::transform 对序列进行了处理,代码不仅简洁,而且非常直观。

三、views::zip 详解

3.1 功能与定义

std::ranges::views::zip 是C++23引入的一个范围适配器,它接受一个或多个 view ,并生成一个 view ,其第 i 个元素是由所有视图的第 i 个元素组成的类似元组的值。生成的视图的大小是所有适配的视图大小的最小值。

在标头 <ranges> 中定义如下:

template < ranges::input_range ... Views >
requires ( ranges::view < Views> && ...) && ( sizeof...(Views) > 0 )
class zip_view
: public ranges::view_interface <zip_view< Views...>>
(1) (C++23)namespace views {
inline constexpr /*unspecified*/ zip = /*unspecified*/;
}
(2) (自 C++23)调用签名
template < ranges::viewable_range... Rs >
requires /* 见下文 */
constexpr ranges::view auto zip( Rs&&... rs ) ;
(自 C++23)

zip_view 始终实现 input_range ,并且若所有适配的 view 类型均实现 forward_rangebidirectional_rangerandom_access_rangesized_range 时实现对应的概念。

3.2 使用场景

views::zip 适用于需要同时遍历多个范围的场景,例如,当你需要对多个数组或容器进行并行处理时,可以使用 views::zip 将它们组合在一起,然后进行统一的操作。

3.3 示例代码

#include <list>
#include <array>
#include <tuple>
#include <ranges>
#include <vector>
#include <string>
#include <iostream>void print(auto const rem, auto const& range)
{for (std::cout << rem; auto const& elem : range)std::cout << elem << ' ';std::cout << '\n';
}int main()
{auto x = std::vector{1, 2, 3, 4};auto y = std::list<std::string>{"α", "β", "γ", "δ", "ε"};auto z = std::array{'A', 'B', 'C', 'D', 'E', 'F'};print("Source views:", "");print("x: ", x);print("y: ", y);print("z: ", z);print("\nzip(x,y,z):", "");for (std::tuple<int&, std::string&, char&> elem : std::views::zip(x, y, z)){std::cout << std::get<0>(elem) << ' '<< std::get<1>(elem) << ' '<< std::get<2>(elem) << '\n';std::get<char&>(elem) += ('a' - 'A'); // modifies the element of z}print("\nAfter modification, z: ", z);
}

其运行的结果是:

Source views:
x: 1 2 3 4
y: α β γ δ ε
z: A B C D E Fzip(x,y,z):
1 α A
2 β B
3 γ C
4 δ DAfter modification, z: a b c d E F

四、views::zip_transform 详解

4.1 功能与定义

std::ranges::views::zip_transform 同样是C++23引入的一个范围适配器,它接受一个可调用对象和一个或多个 view ,并生成一个 view ,其第 i 个元素是将可调用对象应用于所有视图的第 i 个元素的结果。

在标头 <ranges> 中定义如下:

template< std::copy_constructible F, ranges::input_range... Views >
requires (ranges::view<Views> && ...) && (sizeof...(Views) > 0) &&std::is_object_v<F> && std::regular_invocable<F&, ranges::range_reference_t<Views>...> &&/*can-reference*/<std::invoke_result_t<F&, ranges::range_reference_t<Views>...>>
class zip_transform_view: public ranges::view_interface<zip_transform_view<F, Views...>>
(1) (since C++23)namespace views {inline constexpr /*unspecified*/ zip_transform = /*unspecified*/;
}
(2) (since C++23)Call signature
template< class F, ranges::viewable_range... Rs >
requires /* see below */
constexpr auto zip_transform( F&& f, Rs&&... rs );
(since C++23)

4.2 使用场景

views::zip_transform 适用于需要对多个范围的元素进行某种计算或转换的场景,例如,你可以使用它来计算两个数组对应元素的和、差、积等。

4.3 示例代码

#include <iostream>
#include <vector>
#include <ranges>int main() {std::vector<int> a = {1, 2, 3, 4};std::vector<int> b = {5, 6, 7, 8};auto result = std::views::zip_transform([](int x, int y) { return x + y; }, a, b);for (int val : result) {std::cout << val << ' ';}std::cout << '\n';return 0;
}

在这个示例中,我们使用 views::zip_transform 计算了两个向量对应元素的和,并将结果输出。

五、views::zipviews::zip_transform 的对比

5.1 功能差异

  • views::zip 主要用于将多个范围的元素组合成元组,方便同时遍历多个范围。它只是简单地将多个范围的元素打包在一起,不进行任何计算或转换。
  • views::zip_transform 则在 views::zip 的基础上,增加了对元素的计算或转换功能。它会将可调用对象应用于每个元组中的元素,并返回计算结果。

5.2 使用场景差异

  • 当你只需要同时遍历多个范围,而不需要对元素进行额外的计算时,使用 views::zip 即可。
  • 当你需要对多个范围的元素进行某种计算或转换时,使用 views::zip_transform 更加合适。

5.3 代码复杂度差异

  • views::zip 的代码相对简单,只需要将多个范围作为参数传递给 views::zip 即可。
  • views::zip_transform 除了需要传递多个范围外,还需要传递一个可调用对象,代码相对复杂一些。

六、总结

views::zipviews::zip_transform 是C++23中非常实用的两个特性,它们基于Ranges库,为处理多个范围的数据提供了更加便捷和高效的方式。views::zip 可以将多个范围的元素组合在一起,方便同时遍历;views::zip_transform 则可以对多个范围的元素进行计算或转换,进一步扩展了功能。

在实际开发中,我们可以根据具体的需求选择使用 views::zipviews::zip_transform 。同时,我们也可以将它们与其他Ranges库的工具函数结合使用,实现更加复杂的数据处理逻辑。随着C++23的不断普及和应用,这些新特性将逐渐得到更多的关注和使用,帮助开发者编写出更简洁、高效、易读的代码。

相关文章:

C++23 views::zip 和 views::zip_transform (P2321R2) 深入解析

文章目录 一、引言二、C23与Ranges库背景知识2.1 C23概述2.2 Ranges库回顾 三、views::zip 详解3.1 功能与定义3.2 使用场景3.3 示例代码 四、views::zip_transform 详解4.1 功能与定义4.2 使用场景4.3 示例代码 五、views::zip 与 views::zip_transform 的对比5.1 功能差异5.2…...

Starrocks的主键表涉及到的MOR Delete+Insert更新策略

背景 写这个文章的作用主要是做一些总结和梳理&#xff0c;特别是正对大数据场景下的实时写入更新策略 COW 和 MOR 以及 DeleteInsert 的技术策略的演进&#xff0c; 这也适用于其他大数据的计算存储系统。该文章主要参考了Primary Key table. 分析总结 Starrocks 的主键表主…...

【计算机视觉】OpenCV实战项目:基于OpenCV的车牌识别系统深度解析

基于OpenCV的车牌识别系统深度解析 1. 项目概述2. 技术原理与算法设计2.1 图像预处理1) 自适应光照补偿2) 边缘增强 2.2 车牌定位1) 颜色空间筛选2) 形态学操作3) 轮廓分析 2.3 字符分割1) 投影分析2) 连通域筛选 2.4 字符识别 3. 实战部署指南3.1 环境配置3.2 项目代码解析 4.…...

20250513_问题:由于全局Pytorch导致的错误

文章目录 前言问题&#xff1a;由于全局Pytorch导致的错误找到问题(1)找到问题(2) 总结 前言 问题&#xff1a;由于全局Pytorch导致的错误 代码报错显示无法使用CUDA AttributeError: module ‘torch._C’ has no attribute ‘_cuda_setDevice’ 找到问题(1) import torch pri…...

flinksql实践(从kafka读数据)

本案例是基于flinksql实现的&#xff0c;将逐步实现从kafka读写数据&#xff0c;聚合查询&#xff0c;关联维表(外部系统)等。 环境准备 首先确保电脑已经安装好zookeeper、kafka、flink。本文flink使用单机模式&#xff0c;zookeeper和kafka也使用单机配置。(环境配置部分可以…...

Linux系统:文件系统前言,详解CHSLBA地址

本节重点 理解硬盘的组成结构与工作原理理解柱面、扇区CHS地址进行寻址对整块硬盘的逻辑抽象LBA地址进行寻址LBA与CHS地址的相互转换 一、初识硬盘 1.1 基本概念 硬盘&#xff08;Hard Disk Drive&#xff0c;HDD&#xff09;是一种用于存储和检索数据的计算机硬件设备。它…...

2025年01月10日浙江鑫越系统科技前端面试

目录 vue2 和 vue3 的区别vue 怎么封装组件js 怎么把一个数组置空怎么组件自己调用自己的组件v-bind:attribute 和 v-bind“{attribute}” 的区别var let const 的区别this 指向作用域链闭包原型链事件循环 1. vue2 和 vue3 的区别 Vue 2 和 Vue 3 在多个方面存在区别&#…...

2025.05.11阿里云机考真题算法岗-第三题

📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围OJ 03. 镜像追踪游戏 问题描述 A先生正在玩一款名为「镜像追踪」的游戏。游戏在一个 n n n...

实景三维建模软件应用场景(众趣科技实景三维建模)

实景三维建模软件应用场景概述 实景三维建模软件&#xff0c;作为数字化时代的重要工具&#xff0c;不仅能够真实、立体、时序化地反映和表达物理世界&#xff0c;还为国家的基础设施建设和数字化发展提供了有力的支撑。 在测绘与地理信息领域&#xff0c;实景三维建模软件是构…...

centos中libc.so.6No such file的解决方式

你在运行安装程序时遇到了以下错误&#xff1a; Configuring the installer for this systems environment...strings: /lib/libc.so.6: No such file 这个错误通常是由于系统中缺少 glibc&#xff08;GNU C Library&#xff09;或其相关文件导致的。glibc 是 Linux 系统中的…...

MapReduce打包运行

1. 编写 MapReduce 程序 首先需要编写 MapReduce 程序&#xff0c;通常包含 Mapper、Reducer 和 Driver 类。例如&#xff0c;一个简单的 WordCount 程序&#xff1a; java import java.io.IOException; import java.util.StringTokenizer;import org.apache.hadoop.conf.Con…...

RustDesk:开源电脑远程控制软件

RustDesk&#xff1a;开源电脑远程控制软件 RustDesk&#xff1a;开源电脑远程控制软件一、RustDesk 简介二、下载教程2.1 桌面版下载2.2 Android 版下载 三、安装教程3.1 桌面版安装 四、功能讲解4.1 远程控制4.2 文件传输4.3 安全可靠4.4 自定义服务器 五、RustDesk技术架构解…...

【Unity】WebGL开发问题汇总

1 前言 主要记录下WebGL开发过程中遇到的各种问题。 2 问题 2.1 中文字体不显示 问题&#xff1a; 经典问题了。将项目打包在WebGL平台后&#xff0c;运行发现所用中文字体都不现实了。 解决办法&#xff1a; 替换Text组件的“字体”。可以将电脑字体复制到项目当中然后替换组…...

华为海思系列----昇腾张量编译器(ATC)模型转换工具----入门级使用指南(LINUX版)

由于官方SDK比较冗余且经常跨文档讲解且SDK整理的乱七八糟,对于新手来说全部看完上手成本较高,本文旨在以简短的方式介绍 CAFFE / ONNX 模型转 om 模型,并进行推理的全流程。希望能够帮助到第一次接触华为海思框架的道友们。大佬们就没必要看这种基础文章啦! 注:本…...

c++STL-list的模拟实现

cSTL-list的模拟实现 list源码剖析list模拟实现list构造函数拷贝构造函数赋值重载迭代器 iterator访问结点数size和判空尾插 push_back头插 push_front尾删pop_back头删pop_front插入 insert删除 erase清空clear和析构函数访问结点 参考程序 list源码剖析 建议先看cSTL-list的…...

RabbitMQ 核心概念与消息模型深度解析(二)

四、代码实战 了解了 RabbitMQ 的核心概念和消息模型后&#xff0c;接下来我们通过代码实战来进一步加深对它们的理解和掌握。下面将以 Java 和 Spring AMQP 为例&#xff0c;展示如何使用 RabbitMQ 进行消息的发送和接收。 4.1 环境准备 在开始编写代码之前&#xff0c;需要…...

JAVA研发+前后端分离,ZKmall开源商城B2C商城如何保障系统性能?

在电商行业竞争白热化的当下&#xff0c;B2C 商城系统的性能表现成为决定用户留存与商业成败的关键因素。ZKmall 开源商城凭借 Java 研发与前后端分离架构的深度融合&#xff0c;构建起一套高效、稳定且具备强大扩展性的系统架构&#xff0c;从底层技术到上层应用全方位保障性能…...

【android bluetooth 框架分析 02】【Module详解 6】【StorageModule 模块介绍】

1. 背景 我们在 gd_shim_module 介绍章节中&#xff0c;看到 我们将 StorageModule 模块加入到了 modules 中。 // system/main/shim/stack.cc modules.add<storage::StorageModule>();在 ModuleRegistry::Start 函数中我们对 加入的所有 module 挨个初始化。 而在该函…...

Datawhale 5月llm-universe 第1次笔记

课程地址&#xff1a;GitHub - datawhalechina/llm-universe: 本项目是一个面向小白开发者的大模型应用开发教程&#xff0c;在线阅读地址&#xff1a;https://datawhalechina.github.io/llm-universe/ 难点&#xff1a;配置conda环境变量 我用的vscode github方法 目录 重要…...

Linux架构篇、第五章git2.49.0部署与使用

Linux_架构篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;git2.49.0部署与使用 版本号: 1.0,0 作者: 老王要学习 日期: 2025.05.13 适用环境: Centos7 文档说明 这份文档聚焦于在 CentOS 7 环境下部署和…...

南方科技大学Science! 自由基不对称催化新突破 | 乐研试剂

近日&#xff0c;南方科技大学刘心元教授团队联合浙江大学洪鑫教授团队在自由基不对称催化领域取得新进展。课题组开发了一系列大位阻阴离子 N,N,P-配体&#xff0c;用于铜催化未活化外消旋仲烷基碘与亚砜亚胺的不对称胺化反应。该反应表现出广泛的底物兼容性&#xff0c;涵盖具…...

手机换IP真的有用吗?可以干什么?

在当今数字化时代&#xff0c;网络安全和个人隐私保护日益受到重视。手机作为我们日常生活中不可或缺的工具&#xff0c;其网络活动痕迹往往通过IP地址被记录和追踪。那么&#xff0c;手机换IP真的有用吗&#xff1f;它能为我们带来哪些实际好处&#xff1f;本文将为你一一解答…...

【C++详解】类和对象(上)类的定义、实例化、this指针

文章目录 一、类的定义1、类定义格式2、访问限定符3、类域 二、实例化1、实例化概念2、对象大小 三、this指针 一、类的定义 1、类定义格式 class为定义类的关键字&#xff0c;Stack为类的名字&#xff0c;{}中为类的主体&#xff0c;注意类定义结束时后面分号不能省略。类体中…...

C语言—再学习(数据的存储类别)

在c语言中&#xff0c;每个变量和函数都有两个属性&#xff1a;数据类型和数据的存储类别 C的存储类别包括4种&#xff1a;自动挡&#xff08;auto&#xff09;、静态的&#xff08;static&#xff09;、寄存器的&#xff08;register&#xff09;、外部的&#xff08;extern&…...

软考软件评测师——计算机组成与体系结构(分级存储架构)

一、虚拟存储技术 虚拟存储系统通过软硬件协同实现内存扩展&#xff0c;其核心特征包括&#xff1a; 逻辑容量扩展能力&#xff1a;实际物理内存与外存结合&#xff0c;呈现远大于物理内存的连续地址空间动态加载机制&#xff1a;程序运行时仅加载必要部分到内存&#xff0c;…...

需求跟踪矩阵准确性的5大策略

需求跟踪矩阵的准确性可显著提升软件项目质量&#xff0c;确保需求的全面覆盖、减少遗漏和偏差&#xff0c;有利于优化变更管理&#xff0c;降低返工风险&#xff0c;最终保障产品符合用户预期和业务目标。如果不能保证跟踪矩阵的准确性&#xff0c;可能会导致需求遗漏、测试覆…...

【调度算法】MAPF多智能体路径规划问题

参考链接&#xff1a;https://blog.csdn.net/qq_43353179/article/details/129396325 在这篇博客的基础上对一些省略的部分进行补充。 网站&#xff1a;https://mapf.info/ 可行性判断 1. k-鲁棒性&#xff08;k-robust MAPF&#xff09; 在经典 MAPF 中&#xff0c;只要所有…...

迅龙3号基于兆讯MH22D3适配CST328多点触摸驱动开发笔记

MH22D3芯片是兆讯公司新推出的基于cortex-M3内核的新一代芯片&#xff0c;专注于显示应用&#xff0c;其主频高达216Mhz&#xff0c;64KB SRAM&#xff0c;512KB Flash&#xff0c;开发UI应用游刃有余。详细介绍请看&#xff1a;MH22D3新一代显控应用性价比之王 新龙微基于MH22…...

推荐算法工程化:ZKmall模板商城的B2C 商城的用户分层推荐策略

在 B2C 电商竞争激烈的市场环境中&#xff0c;精准推荐已成为提升用户体验、促进商品销售的关键。ZKmall 模板商城通过推荐算法工程化手段&#xff0c;深度挖掘用户数据价值&#xff0c;制定科学的用户分层推荐策略&#xff0c;实现 “千人千面” 的个性化推荐&#xff0c;帮助…...

你对于JVM底层的理解

JVM&#xff08;Java虚拟机&#xff09;是一个执行Java字节码的虚拟机&#xff0c;负责将Java程序的代码转化为能够在不同操作系统上运行的机器码。为了深入理解JVM的底层工作原理&#xff0c;可以从以下几个方面入手&#xff1a; 1. 类加载机制 JVM的类加载机制是其核心之一…...

深入探讨 Java 性能术语与优化实践

在 Java 开发中,性能优化是确保应用程序高效运行的关键。无论是构建实时处理系统还是大规模分布式服务,理解性能术语和分析方法都至关重要。本文将详细介绍 Java 性能中的核心术语,包括延迟(Latency)、吞吐量(Throughput)、利用率(Utilization)、效率(Efficiency)、…...

简单介绍Qt的属性子系统

深入理解Qt的属性系统 ​ 笔者最近正在大规模的开发Qt的项目和工程&#xff0c;这里笔者需要指出的是&#xff0c;这个玩意在最常规的Qt开发中是相对比较少用的&#xff0c;笔者也只是在Qt的QPropertyAnimation需要动画感知笔者设置的一个属性的时候方才知道这个东西的。因此&…...

【PmHub后端篇】PmHub中基于自定义注解和AOP的服务接口鉴权与内部认证实现

1 引言 在现代软件开发中&#xff0c;尤其是在微服务架构下&#xff0c;服务接口的鉴权和内部认证是保障系统安全的重要环节。本文将详细介绍PmHub中如何利用自定义注解和AOP&#xff08;面向切面编程&#xff09;实现服务接口的鉴权和内部认证&#xff0c;所涉及的技术知识点…...

消息~组件(群聊类型)ConcurrentHashMap发送

为什么选择ConcurrentHashMap&#xff1f; 在开发聊天应用时&#xff0c;我们需要存储和管理大量的聊天消息数据&#xff0c;这些数据会被多个线程频繁访问和修改。比如&#xff0c;当多个用户同时发送消息时&#xff0c;服务端需要同时处理这些消息的存储和查询。如果用普通的…...

掌控随心 - 服务网格的流量管理艺术 (Istio 实例)

掌控随心 - 服务网格的流量管理艺术 (Istio 实例) 想象一下,没有服务网格的时候,我们要实现像“将 1% 的用户流量导入到新版本应用”、“根据用户设备类型访问不同后端”、“模拟下游服务故障”这类高级流量策略,通常需要在代码、负载均衡器、API 网关等多个地方进行复杂且分…...

Github 2025-05-13 Python开源项目日报 Top10

根据Github Trendings的统计&#xff0c;今日(2025-05-13统计)共有10个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量Python项目10TypeScript项目1 ComfyUI&#xff1a;强大而模块化的稳定扩散GUI 创建周期&#xff1a;399 天开…...

Spring Boot 自动装配原理详解

Spring Boot 的自动装配&#xff08;Auto-Configuration&#xff09;是其核心特性之一&#xff0c;它极大地简化了 Spring 应用的配置过程。通过自动装配&#xff0c;Spring Boot 能够根据项目中的依赖&#xff08;例如&#xff0c;添加了 Spring Data JPA 依赖后自动配置数据库…...

Python核心数据类型全解析:字符串、列表、元组、字典与集合

导读&#xff1a; Python 是一门功能强大且灵活的编程语言&#xff0c;而其核心数据类型是构建高效程序的基础。本文深入剖析了 Python 的五大核心数据类型——字符串、列表、元组、字典和集合&#xff0c;结合实际应用场景与最佳实践&#xff0c;帮助读者全面掌握这些数据类型…...

索尼(sony)摄像机格式化后mp4的恢复方法

索尼(sony)的Alpha 7 Ⅳ系列绝对称的上是索尼的“全画幅标杆机型”&#xff0c;A7M4配备了3300万像素的CMOS&#xff0c;以及全新研发的全画幅背照式Exmor R™CMOS影像传感器&#xff0c;搭载BIONZ XR™影像处理器&#xff0c;与旗舰微单™Alpha 1如出一辙。下面我们来看看A7M4…...

Kubernetes容器运行时:Containerd vs Docker

Containerd 和 Docker 是容器技术领域的两个核心组件&#xff0c;它们在功能定位、架构设计、性能特点及适用场景上有显著差异。以下是两者的详细对比分析&#xff1a; 一、定位与功能 特性DockerContainerd核心定位完整的容器平台&#xff0c;包含构建、运行、编排等全生命周…...

免费专业级 PDF 处理!SolidPDF OCR 识别 + 精准转换批量处理

各位办公小能手们&#xff01;今天咱来聊聊一款超牛的软件——SolidConverterPDF。这可是个专业的多功能PDF处理工具&#xff0c;啥格式转换、文档编辑、扫描识别&#xff0c;它都能搞定&#xff01;下面我就给大伙详细唠唠它的厉害之处。 先说说它的核心功能。 一是PDF格式转换…...

电子电器架构 --- 区域计算架构(Zonal Compute)备战下一代电子电气架构

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 钝感力的“钝”,不是木讷、迟钝,而是直面困境的韧劲和耐力,是面对外界噪音的通透淡然。 生活中有两种人,一种人格外在意别人的眼光;另一种人无论…...

API的学习总结(上)

在 Java 中&#xff0c;API 指的是 Java 提供的一系列类、接口、方法和工具&#xff0c;用于开发 Java 应用程序。Java API 是 Java 平台的核心组成部分&#xff0c;它提供了丰富的功能&#xff0c;包括基础数据类型、集合框架、输入输出、网络编程、多线程、数据库连接等。 核…...

Spring Boot之Web服务器的启动流程分析

如何判断创建哪种web容器&#xff1a;servlet&#xff1f;reactive&#xff1f; 我们在启动Spring Boot程序的时候&#xff0c;会使用SpringApplication.run方法来启动&#xff0c;在启动流程中首先要判断的就是需要启动什么类型的服务器&#xff0c;是servlet&#xff1f;或者…...

代码随想录算法训练营第六十三天| 图论9—卡码网47. 参加科学大会,94. 城市间货物运输 I

每日被新算法方式轰炸的一天&#xff0c;今天是dijkstra&#xff08;堆优化版&#xff09;以及Bellman_ford &#xff0c;尝试理解中&#xff0c;属于是只能照着代码大概说一下在干嘛。 47. 参加科学大会 https://kamacoder.com/problempage.php?pid1047 dijkstra&#xff08…...

RAG之大规模解析 PDF 文档全流程实战

PDF 文档在商业、学术和政府领域无处不在,蕴含着大量宝贵信息。然而,从 PDF 中提取结构化数据却面临着独特的挑战,尤其是在处理数千甚至数百万个文档时。本指南探讨了大规模解析 PDF 的策略和工具。 PDF解析挑战 PDF 的设计初衷是为了提供一致的视觉呈现,而非数据提取。这…...

uart16550详细说明

一、介绍 uart16550 ip core异步串行通信IP连接高性能的微控制器总线AXI,并为异步串行通信提供了 控制接口。软核设计连接了axilite接口。 二、特性 1.axilite接口用于寄存器访问和数据传输 2.16650串口和16450串口的软件和硬件寄存器都是兼容的 3.默认的core配置参数&#xf…...

Docker 环境安装(2025最新版)

Docker在主流的操作系统和云平台上都可以使用&#xff0c;包括Linux操作 系统&#xff08;如Ubuntu、 Debian、Rocky、Redhat等&#xff09;、MacOS操作系统和 Windows操作系统&#xff0c;以及AWS等云平 台。 Docker官网&#xff1a; https://docs.docker.com/ 配置宿主机网…...

Comparator不满足自反性错误,Comparison method violates its general contract

APP运行退出&#xff0c;跟踪信息 java.lang.IllegalArgumentException: Comparison method violates its general contract! Collections.sort(idxsList);//按score升序排列 查看idxs类 public int compareTo(Idxs o) { //重写compareTo方法 return (int) (this.g…...

[Java实战]Spring Boot 3 整合 Apache Shiro(二十一)

[Java实战]Spring Boot 3 整合 Apache Shiro&#xff08;二十一&#xff09; 引言 在复杂的业务系统中&#xff0c;安全控制&#xff08;认证、授权、加密&#xff09;是核心需求。相比于 Spring Security 的重量级设计&#xff0c;Apache Shiro 凭借其简洁的 API 和灵活的扩…...