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

std::ranges::set_intersection set_union set_difference set_symmetric_difference

std::ranges::set_intersection:是 C++20 引入的一个算法,用于计算两个已排序范围的交集。它将两个范围的交集元素复制到输出范围中。

std::ranges::set_intersection 

用于计算两个已排序范围的交集。它将两个范围的交集元素复制到输出范围中。

注意事项

  1. 输入范围必须已排序
  2. 目标范围必须有足够空间存储交集结果
  3. 交集结果默认按升序排列。
  4. 若元素重复,交集次数取两范围中较小的重复次数(例如 a = [2, 2, 3]b = [2, 2, 2],则交集为 [2, 2])。

### 语法

Defined in header <algorithm>

Call signature

template< std::input_iterator I1, std::sentinel_for<I1> S1,

          std::input_iterator I2, std::sentinel_for<I2> S2,
          std::weakly_incrementable O, class Comp = ranges::less,
          class Proj1 = std::identity, class Proj2 = std::identity >
requires std::mergeable<I1, I2, O, Comp, Proj1, Proj2>
constexpr set_intersection_result<I1, I2, O>
    set_intersection( I1 first1, S1 last1, I2 first2, S2 last2,
                      O result, Comp comp = {},

                      Proj1 proj1 = {}, Proj2 proj2 = {} );
(1)(since C++20)
template< ranges::input_range R1, ranges::input_range R2,

          std::weakly_incrementable O, class Comp = ranges::less,
          class Proj1 = std::identity, class Proj2 = std::identity >
requires std::mergeable<ranges::iterator_t<R1>, ranges::iterator_t<R2>,
                        O, Comp, Proj1, Proj2>
constexpr set_intersection_result<ranges::borrowed_iterator_t<R1>,
                                  ranges::borrowed_iterator_t<R2>, O>
    set_intersection( R1&& r1, R2&& r2, O result, Comp comp = {},

                      Proj1 proj1 = {}, Proj2 proj2 = {} );
(2)(since C++20)

Helper types

template< class I1, class I2, class O >
using set_intersection_result = ranges::in_in_out_result<I1, I2, O>;

(3)(since C++20)

### 参数
- `r1` 和 `r2`:输入范围,必须是已排序的。
- `result`:输出迭代器,指向存储交集元素的位置。
- `comp`:比较函数对象,用于比较元素。
- `proj1` 和 `proj2`:投影函数对象,用于投影元素。

### 返回值
返回一个 `ranges::set_intersection_result` 结构,包含两个输入范围的结束迭代器和输出范围的结束迭代器。

### 示例
以下是一个使用 `std::ranges::set_intersection` 的示例:

#include <algorithm>
#include <iostream>
#include <iterator>
#include <vector>void print(const auto& v, const auto& rem)
{std::cout << "{ ";for (const auto& e : v)std::cout << e << ' ';std::cout << '}' << rem;
}int main()
{const auto in1 = {1, 2, 2, 3, 4, 5, 6};const auto in2 = {2, 2, 3, 3, 5, 7};std::vector<int> out {};std::ranges::set_intersection(in1, in2, std::back_inserter(out));print(in1, " ∩ "), print(in2, " = "), print(out, "\n");
}

Output:

{ 1 2 2 3 4 5 6 } ∩ { 2 2 3 3 5 7 } = { 2 2 3 5 }

在这个示例中,`in1` 和 `in2` 是两个已排序的整数向量。`std::ranges::set_intersection` 计算它们的交集,并将结果存储在 `out` 向量中。最后,程序输出交集元素。

示例 2:自定义比较和投影
#include <algorithm>
#include <vector>
#include <iostream>
#include <string>struct Person {std::string name;int age;
};int main() {std::vector<Person> a = {{"Alice", 20}, {"Bob", 25}, {"Charlie", 30}};std::vector<Person> b = {{"Bob", 25}, {"David", 28}, {"Eve", 30}};std::vector<Person> out;// 按 age 字段比较,计算交集std::ranges::set_intersection(a, b,std::back_inserter(out),[](int age1, int age2) { return age1 < age2; }, // 比较函数&Person::age, // 对 a 的投影:提取 age&Person::age  // 对 b 的投影:提取 age);// 输出结果:Bob(25), Charlie(30)for (const auto& p : out) {std::cout << p.name << "(" << p.age << ") ";}
}

更多请了解:https://en.cppreference.com/w/cpp/algorithm/ranges/set_intersection

std::ranges::set_union

std::ranges::set_union 是 C++20 引入的算法,用于合并两个已排序范围的并集,并将结果写入目标范围。

Defined in header <algorithm>

Call signature

template< std::input_iterator I1, std::sentinel_for<I1> S1,

          std::input_iterator I2, std::sentinel_for<I2> S2,
          std::weakly_incrementable O, class Comp = ranges::less,
          class Proj1 = std::identity, class Proj2 = std::identity >
requires std::mergeable<I1, I2, O, Comp, Proj1, Proj2>
constexpr set_union_result<I1, I2, O>
    set_union( I1 first1, S1 last1, I2 first2, S2 last2,
               O result, Comp comp = {},

               Proj1 proj1 = {}, Proj2 proj2 = {} );
(1)(since C++20)
template< ranges::input_range R1, ranges::input_range R2,

          std::weakly_incrementable O, class Comp = ranges::less,
          class Proj1 = std::identity, class Proj2 = std::identity >
requires std::mergeable<ranges::iterator_t<R1>, ranges::iterator_t<R2>,
                        O, Comp, Proj1, Proj2>
constexpr set_union_result<ranges::borrowed_iterator_t<R1>,
                           ranges::borrowed_iterator_t<R2>, O>
    set_union( R1&& r1, R2&& r2, O result, Comp comp = {},

               Proj1 proj1 = {}, Proj2 proj2 = {} );

 

参数说明

  1. first1last1:第一个输入范围的起止迭代器。
  2. first2last2:第二个输入范围的起止迭代器。
  3. result:目标范围的起始迭代器。
  4. comp:比较函数(默认为 std::ranges::less)。
  5. proj1proj2:对输入元素的投影函数(默认为 std::identity)。

要求

  1. 输入范围必须按 comp 定义的顺序排序
  2. 目标范围必须有足够空间存储并集结果。
  3. 重复元素处理
    • 若元素在某个范围中重复出现,并集会保留所有重复项(但不会跨范围合并)。
    • 例如:a = [2, 2, 3]b = [2, 2, 2],并集为 [2, 2, 2, 3]
  4. 目标空间:需确保目标范围有足够空间,或使用 std::back_inserter 动态扩展。
  5. 性能:时间复杂度为线性(最多 2*(N1 + N2) - 1 次比较,其中 N1 和 N2 为输入范围长度)。

返回值

返回指向目标范围末尾的迭代器

示例

示例 1:基本用法

#include <algorithm>
#include <vector>
#include <iostream>
#include <iterator>int main() {std::vector<int> a = {1, 2, 3, 4, 5};std::vector<int> b = {3, 4, 5, 6, 7};std::vector<int> out;// 计算并集std::ranges::set_union(a, b, std::back_inserter(out));// 输出结果:1 2 3 4 5 6 7for (int x : out) {std::cout << x << " ";}
}

输出结果:

1 2 3 4 5 6 7

示例 2:自定义比较和投影
#include <algorithm>
#include <vector>
#include <iostream>
#include <string>struct Person {std::string name;int age;
};int main() {std::vector<Person> a = {{"Alice", 20}, {"Bob", 25}, {"Charlie", 30}};std::vector<Person> b = {{"Bob", 26}, {"David", 28}, {"Eve", 30}};std::vector<Person> out;// 按 age 字段比较,计算并集std::ranges::set_union(a, b,std::back_inserter(out),[](int age1, int age2) { return age1 < age2; }, // 比较函数&Person::age, // 对 a 的投影:提取 age&Person::age  // 对 b 的投影:提取 age);// 输出结果:Alice(20), Bob(25), Charlie(30), David(28), Eve(30)for (const auto& p : out) {std::cout << p.name << "(" << p.age << ") ";}
}

输出结果:

Alice(20) Bob(25) Bob(26) David(28) Charlie(30) 

与传统 std::set_union 的区别

  • 范围支持:直接接受范围参数(如 std::ranges::set_union(a, b, ...)),而非迭代器对。
  • 投影功能允许通过 proj1 和 proj2 对输入元素进行变换后再比较
  • 约束检查:通过 C++20 概念明确约束参数类型,增强类型安全。

更多信息:

https://en.cppreference.com/w/cpp/algorithm/ranges/set_union


    std::ranges::set_difference

    Defined in header <algorithm>

    Call signature

    template< std::input_iterator I1, std::sentinel_for<I1> S1,

              std::input_iterator I2, std::sentinel_for<I2> S2,
              std::weakly_incrementable O, class Comp = ranges::less,
              class Proj1 = std::identity, class Proj2 = std::identity >
    requires std::mergeable<I1, I2, O, Comp, Proj1, Proj2>
    constexpr set_difference_result<I1, O>
        set_difference( I1 first1, S1 last1, I2 first2, S2 last2,
                        O result, Comp comp = {},

                        Proj1 proj1 = {}, Proj2 proj2 = {} );
    (1)(since C++20)
    template< ranges::input_range R1, ranges::input_range R2,

              std::weakly_incrementable O, class Comp = ranges::less,
              class Proj1 = std::identity, class Proj2 = std::identity >
    requires std::mergeable<ranges::iterator_t<R1>, ranges::iterator_t<R2>,
                            O, Comp, Proj1, Proj2>
    constexpr set_difference_result<ranges::borrowed_iterator_t<R1>, O>
        set_difference( R1&& r1, R2&& r2, O result, Comp comp = {},

                        Proj1 proj1 = {}, Proj2 proj2 = {} );

    std::ranges::set_difference 是 C++20 引入的算法,用于计算两个已排序范围的差集(即存在于第一个范围但不在第二个范围中的元素),并将结果写入目标范围。它是传统 std::set_difference 的范围适配版本,支持投影和直接使用范围参数。


    参数说明

    1. first1last1:第一个输入范围的起止迭代器(要计算差集的主范围)。
    2. first2last2:第二个输入范围的起止迭代器(被减的范围)。
    3. result:目标范围的起始迭代器。
    4. comp:比较函数(默认为 std::ranges::less)。
    5. proj1proj2:对输入元素的投影函数(默认为 std::identity)。

    要求

    1. 两个输入范围必须按 comp 定义的顺序排序
    2. 目标空间:需确保目标范围有足够空间,或使用 std::back_inserter 动态扩展。
    3. 重复元素处理
      • 若元素在第一个范围中出现 m 次,在第二个范围中出现 n 次,则差集中保留 max(m - n, 0) 次。
      • 例如:a = [2, 2, 3]b = [2],差集为 [2, 3]
    4. 性能:时间复杂度为线性(最多 2*(N1 + N2) - 1 次比较,其中 N1 和 N2 为输入范围长度)。

    示例

    示例 1:基本用法
    #include <algorithm>
    #include <vector>
    #include <iostream>
    #include <iterator>int main() {std::vector<int> a = {1, 2, 3, 4, 5};std::vector<int> b = {3, 4, 5, 6, 7};std::vector<int> out;// 计算差集:a 中存在但 b 中不存在的元素std::ranges::set_difference(a, b, std::back_inserter(out));// 输出结果:1 2for (int x : out) {std::cout << x << " ";}
    }
    

    输出结果:

    1 2

    示例 2:自定义比较和投影
    #include <algorithm>
    #include <vector>
    #include <iostream>
    #include <string>struct Person {std::string name;int age;
    };int main() {std::vector<Person> a = {{"Alice", 20}, {"Bob", 25}, {"Charlie", 30}};std::vector<Person> b = {{"Bob", 26}, {"David", 28}, {"Eve", 30}};std::vector<Person> out;// 按 age 字段比较,计算差集(a 中存在但 b 中不存在的元素)std::ranges::set_difference(a, b,std::back_inserter(out),[](int age1, int age2) { return age1 < age2; }, // 比较函数&Person::age, // 对 a 的投影:提取 age&Person::age  // 对 b 的投影:提取 age);// 输出结果:Alice(20) Bob(25) for (const auto& p : out) {std::cout << p.name << "(" << p.age << ") ";}
    }

    输出结果:

    Alice(20) Bob(25)

    与传统 std::set_difference 的区别

    • 范围支持:直接接受范围参数(如 std::ranges::set_difference(a, b, ...))。
    • 投影功能:允许通过 proj1 和 proj2 对输入元素进行变换后再比较。
    • 约束检查:通过 C++20 概念明确约束参数类型,增强类型安全。

    std::ranges::set_symmetric_difference

    std::ranges::set_symmetric_difference 是 C++20 中引入的算法,用于计算两个有序范围的对称差集,即存在于任一输入范围但不同时存在于两个范围中的元素。结果会写入输出范围,且保持有序。

    函数原型

    Defined in header <algorithm>

    Call signature

    template< std::input_iterator I1, std::sentinel_for<I1> S1,

              std::input_iterator I2, std::sentinel_for<I2> S2,
              std::weakly_incrementable O, class Comp = ranges::less,
              class Proj1 = std::identity, class Proj2 = std::identity >
    requires std::mergeable<I1, I2, O, Comp, Proj1, Proj2>
    constexpr set_symmetric_difference_result<I1, I2, O>
        set_symmetric_difference( I1 first1, S1 last1, I2 first2, S2 last2,
                                  O result, Comp comp = {},

                                  Proj1 proj1 = {}, Proj2 proj2 = {} );
    (1)(since C++20)
    template< ranges::input_range R1, ranges::input_range R2,

              std::weakly_incrementable O, class Comp = ranges::less,
              class Proj1 = std::identity, class Proj2 = std::identity >
    requires std::mergeable<ranges::iterator_t<R1>, ranges::iterator_t<R2>,
                            O, Comp, Proj1, Proj2>
    constexpr set_symmetric_difference_result<ranges::borrowed_iterator_t<R1>,
                                              ranges::borrowed_iterator_t<R2>, O>
        set_symmetric_difference( R1&& r1, R2&& r2, O result, Comp comp = {},

                                  Proj1 proj1 = {}, Proj2 proj2 = {} );

    参数说明

    • first1, last1: 第一个输入范围的迭代器对。
    • first2, last2: 第二个输入范围的迭代器对。
    • result: 输出范围的起始迭代器。
    • comp: 比较函数(默认为 std::ranges::less)。
    • proj1, proj2: 应用于输入元素的投影(默认为 std::identity)。

    使用条件

    1. 输入范围必须已按升序排列。
    2. 输出范围不能与输入范围重叠。

    示例

    #include <algorithm>
    #include <vector>
    #include <iostream>
    #include <iterator>int main() {std::vector<int> v1 = {1, 2, 4, 5, 6};std::vector<int> v2 = {2, 3, 5, 7};std::vector<int> out;std::ranges::set_symmetric_difference(v1, v2, std::back_inserter(out));// 输出结果for (int n : out) {std::cout << n << ' ';}
    }
    

    输出:

    1 3 4 6 7

    步骤解析

    1. 输入准备v1 和 v2 必须有序。
    2. 算法执行:
      • 比较 v1 和 v2 的当前元素。
      • 将较小元素写入 out,移动对应迭代器。
      • 若元素相等,则跳过,同时移动两个迭代器。
    3. 结果out 包含对称差集元素,保持有序。

    自定义比较和投影

    // 使用自定义比较函数(按降序)
    std::ranges::set_symmetric_difference(v1 | std::views::reverse,v2 | std::views::reverse,std::back_inserter(out),std::greater{}
    );// 使用投影(如比较字符串长度)
    std::vector<std::string> s1 = {"apple", "banana", "cherry"};
    std::vector<std::string> s2 = {"grape", "kiwi", "orange"};
    std::ranges::set_symmetric_difference(s1, s2, std::back_inserter(out_str),[](int a, int b) { return a < b; },[](const std::string& s) { return s.length(); },[](const std::string& s) { return s.length(); }
    );
    

     总结

    std::ranges::set_symmetric_difference 高效计算两个有序范围的对称差集,时间复杂度为 (O(N+M)),空间复杂度为 (O(1))(不计输出)。需确保输入有序且输出范围足够大。

        相关文章:

        std::ranges::set_intersection set_union set_difference set_symmetric_difference

        std::ranges::set_intersection&#xff1a;是 C20 引入的一个算法&#xff0c;用于计算两个已排序范围的交集。它将两个范围的交集元素复制到输出范围中。 std::ranges::set_intersection 用于计算两个已排序范围的交集。它将两个范围的交集元素复制到输出范围中。 注意事项…...

        消息中间件深度剖析:以 RabbitMQ 和 Kafka 为核心

        在现代分布式系统和微服务架构的构建中&#xff0c;消息中间件作为一个不可或缺的组件&#xff0c;承担着系统间解耦、异步处理、流量削峰、数据传输等重要职能。尤其是在面临大规模并发、高可用性和可扩展性需求时&#xff0c;如何选择合适的消息中间件成为了开发者和架构师们…...

        笔试题笔记#6 模拟三道题和总结知识

        两小时快乐模拟&#xff0c;最终三百分耻辱下播&#xff0c;&#xff08;刷的题三道一组&#xff0c;时长两小时&#xff0c;第一题100分&#xff0c;第二题200分&#xff0c;第三题300分&#xff09;&#xff0c;第三题完全想错了&#xff0c;其实挺简单的&#xff0c;就是好久…...

        生成对抗网络(GAN)的“对抗“过程解析:从图像合成到药物发现的跨领域应用

        技术原理&#xff08;数学公式示意图&#xff09; 核心对抗公式 min ⁡ G max ⁡ D V ( D , G ) E x ∼ p d a t a [ log ⁡ D ( x ) ] E z ∼ p z [ log ⁡ ( 1 − D ( G ( z ) ) ) ] \min_G \max_D V(D,G) \mathbb{E}_{x\sim p_{data}}[\log D(x)] \mathbb{E}_{z\sim p_…...

        [鸿蒙笔记-基础篇_自定义构建函数及自定义公共样式]

        在开发中遇到比较复杂的界面的时候都会用到自定义组件&#xff0c;但是在自定义组件内部也会有一些公共的布局及公共的样式&#xff0c;这时就需要用到自定义构建函数和自定义构建样式。说白了就是&#xff1a;在ets文件中进行构建函数和构建样式的抽取封装。比较常用记录一下。…...

        【C】初阶数据结构4 -- 双向循环链表

        之前学习的单链表相比于顺序表来说&#xff0c;就是其头插和头删的时间复杂度很低&#xff0c;仅为O(1) 且无需扩容&#xff1b;但是对于尾插和尾删来说&#xff0c;由于其需要从首节点开始遍历找到尾节点&#xff0c;所以其复杂度为O(n)。那么有没有一种结构是能使得头插和头删…...

        【动态路由】系统Web URL资源整合系列(后端技术实现)【nodejs实现】

        需求说明 软件功能需求&#xff1a;反向代理功能&#xff08;描述&#xff1a;apollo、eureka控、apisix、sentinel、普米、kibana、timetask、grafana、hbase、skywalking-ui、pinpoint、cmak界面、kafka-map、nacos、gateway、elasticsearch、 oa-portal 业务应用等多个web资…...

        解读 Flink Source 接口重构后的 KafkaSource

        前言 Apache Kafka 和 Apache Flink 的结合&#xff0c;为构建实时流处理应用提供了一套强大的解决方案[1]。Kafka 作为高吞吐量、低延迟的分布式消息队列&#xff0c;负责数据的采集、缓冲和分发&#xff1b;而 Flink 则是功能强大的流处理引擎&#xff0c;负责对数据进行实时…...

        一场始于 Selector Error 的拯救行动:企查查数据采集故障排查记

        时间轴呈现事故进程 17:00&#xff1a;开发人员小李正在尝试利用 Python 爬虫从企查查&#xff08;https://www.qcc.com&#xff09;抓取公司工商信息。原本一切正常&#xff0c;但突然发现信息采集失败&#xff0c;程序抛出大量选择器错误。17:15&#xff1a;小李发现&#x…...

        代码随想录刷题攻略---动态规划---子序列问题1---子序列

        子序列&#xff08;不连续&#xff09;和子序列&#xff08;连续&#xff09;的问题 例题1: 最长递增子序列 给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。 子序列是由数组派生而来的序列&#xff0c;删除&#xff08;或不删除&#xff09;数组中的…...

        QEMU 搭建arm linux开发环境

        Qemu 作为一款强大的开源虚拟化软件&#xff0c;为我们提供了一个便捷且经济实惠的方式来模拟各种硬件环境&#xff0c;从而在上面安装和学习 Linux 系统。本文将详细介绍如何使用 Qemu 搭建 Linux 学习环境&#xff0c; 环境准备 操作系统&#xff1a;建议使用 Ubuntu 20.04…...

        PyQt组态软件 拖拽设计界面测试

        PyQt组态软件测试 最近在研究PyQt,尝试写个拖拽设计界面的组态软件&#xff0c;目前实现的功能如下&#xff1a; 支持拖入控件&#xff0c;鼠标拖动控件位置 拖动控件边缘修改控件大小支持属性编辑器&#xff0c;修改当前选中控件的属性 拖动框选控件&#xff0c;点选控件 控…...

        JAVA泛型介绍与举例

        Java中&#xff0c;泛型用于编译阶段限制集合中元素的类型&#xff0c;或者限制类中某个属性的类型&#xff0c;编译过程中发生类型擦除&#xff0c;最终还是Object类型。 1. 集合中的泛型 集合默认可以存储任何类型的元素&#xff0c;即Object类型&#xff0c;当使用一个集合…...

        JavaScript 内置对象-Math对象

        在JavaScript中&#xff0c;Math 对象提供了一系列与数学相关的静态方法和属性&#xff0c;帮助开发者执行复杂的计算任务。无论是简单的算术运算还是高级的几何、统计计算&#xff0c;Math 对象都能提供强大的支持。本文将详细介绍 Math 对象的主要功能及其使用方法。 一、简…...

        Ubuntu 22.04 Desktop企业级基础配置操作指南

        一、网络配置 cd /etc/netplan vi 00-installer-config.yaml 设置如下所示&#xff1a; network:version: 2ethernets:eth0: # 替换为你的实际网络接口名称&#xff0c;如 ens33, enp0s3 等dhcp4: noaddresses:- 192.168.1.100/24 # 静态IP地址和子网掩码gateway4: 192.16…...

        UE_C++ —— UObject Instance Creation

        目录 一&#xff0c;UObject Instance Creation NewObject NewNamedObject ConstructObject Object Flags 二&#xff0c;Unreal Object Handling Automatic Property Initialization Automatic Updating of References Serialization Updating of Property Values …...

        WPF的MVVMLight框架

        在NuGet中引入该库&#xff1a; MVVMLight框架中的命令模式的使用&#xff1a; <StackPanel><TextBox Text"{Binding Name}"/><TextBox Text"{Binding Title}"/><Button Content"点我" Command"{Binding ShowCommand…...

        【云安全】云原生- K8S kubeconfig 文件泄露

        什么是 kubeconfig 文件&#xff1f; kubeconfig 文件是 Kubernetes 的配置文件&#xff0c;用于存储集群的访问凭证、API Server 的地址和认证信息&#xff0c;允许用户和 kubectl 等工具与 Kubernetes 集群进行交互。它通常包含多个集群的配置&#xff0c;支持通过上下文&am…...

        binance python

        binance-futures-connector 4.1.0 from binance.um_futures import UMFutures # U本位 USDT-M Futures /fapi/* # 币本位 COIN-M Delivery /dapi/* proxies { https: http://localhost:7890 } client UMFutures(proxiesproxies)apiKey"" apiSecret"" cl…...

        LLaMA-Factory DeepSeek-R1 模型 微调基础教程

        LLaMA-Factory 模型 微调基础教程 LLaMA-FactoryLLaMA-Factory 下载 AnacondaAnaconda 环境创建软硬件依赖 详情LLaMA-Factory 依赖安装CUDA 安装量化 BitsAndBytes 安装可视化微调启动 数据集准备所需工具下载使用教程所需数据合并数据集预处理 DeepSeek-R1 可视化微调数据集处…...

        利用亚马逊云科技RDS for SQL Server配置向量数据存储

        生成式人工智能&#xff08;AI&#xff09;正迎来又一个快速发展期&#xff0c;引起了开发者们的广泛关注。将生成式能力集成到商业服务和解决方案中变得非常重要。当前的生成式AI解决方案是机器学习和深度学习模型逐步进化迭代的结果。从深度学习到生成式AI的质变飞跃主要是由…...

        ASP.NET Core SixLabors.ImageSharp v1.0 的图像实用程序类 web示例

        这个小型实用程序库需要将 NuGet SixLabors.ImageSharp包&#xff08;版本 1.0.4&#xff09;添加到.NET Core 3.1/ .NET 6 / .NET 8项目中。它与Windows、Linux和 MacOS兼容。 这已针对 ImageSharp v3.0.1 进行了重新设计。 它可以根据百万像素数或长度乘以宽度来调整图像大…...

        JVM 底层探秘:对象创建的详细流程、内存分配机制解析以及线程安全保障策略

        文章目录 1. 类加载检查2. 内存分配① 指针碰撞② 空闲列表线程安全问题&#xff1a; 3. 内存空间初始化4. 对象头设置5. 对象初始化 当Java虚拟机遇到一条 new指令时&#xff0c;会执行以下步骤来创建对象&#xff1a; 1. 类加载检查 首先检查new指令的参数是否能在常量池中…...

        SpringCloud框架下的注册中心比较:Eureka与Consul的实战解析

        摘要 在探讨SpringCloud框架中的两种注册中心之前&#xff0c;有必要回顾单体架构与分布式架构的特点。单体架构将所有业务功能集成在一个项目中&#xff0c;优点是架构简单、部署成本低&#xff0c;但耦合度高。分布式架构则根据业务功能对系统进行拆分&#xff0c;每个模块作…...

        应对DeepSeek总是服务器繁忙的解决方法

        最近由于访问量过大&#xff0c;DeepSeek服务器官网经常弹出&#xff1a;“服务器繁忙&#xff0c;请稍后再试”的提示&#xff0c;直接卡成PPT怎么办&#xff1f;服务器繁忙直接看到视觉疲劳&#xff1a; 解决DeepSeek卡顿问题 DeepSeek使用卡顿问题&#xff0c;是因为访问量…...

        C++ 实践扩展(Qt Creator 联动 Visual Studio 2022)

        ​ 这里我们将在 VS 上实现 QT 编程&#xff0c;实现如下&#xff1a; 一、Vs 2022 配置&#xff08;若已安装&#xff0c;可直接跳过&#xff09; 点击链接&#xff1a;​​​​​Visual Studio 2022 我们先去 Vs 官网下载&#xff0c;如下&#xff1a; 等待程序安装完成之…...

        JENKINS(全面)

        一.linux系统中JENKINS的安装 注意&#xff1a;安装jenkins需要安装jdk&#xff0c;而且具体版本的jenkins有相对应的jdk版本。可参考以下链接。 Redhat Jenkins 软件包https://pkg.jenkins.io/redhat-stable/https://pkg.jenkins.io/redhat-stable/https://pkg.jenkins.io/r…...

        72.git指南(简单)

        Git 操作指南 在开始之前&#xff0c;请确保你已经提前配置好 .gitignore 文件&#xff0c;以避免不必要的文件被 Git 跟踪。如果在初始化仓库后再配置 .gitignore 文件&#xff0c;之前添加的文件仍会被跟踪&#xff0c;需要手动移除。 如下例子忽略了文件夹及文件夹内所有内…...

        LeetCode 232: 用栈实现队列

        LeetCode 232: 用栈实现队列 题目描述 使用栈实现队列的操作。支持以下操作&#xff1a; MyQueue()&#xff1a;初始化队列。push(x)&#xff1a;将元素 x 推入队列。pop()&#xff1a;从队列中移除元素。peek()&#xff1a;返回队列头部的元素。empty()&#xff1a;检查队列…...

        C#关于静态关键词static详解

        Demo代码&#xff1a; public class HomeController : Controller {private DateTime time1 DateTime.Now; // 实例字段private static DateTime time2 DateTime.Now; // 静态字段[HttpGet("index")]public async Task Index(){Console.WriteLine($"now&am…...

        【Pico】使用Pico进行无线串流搜索不到电脑

        使用Pico进行无线串流搜索不到电脑 官串方式&#xff1a;使用Pico互联连接电脑。 故障排查 以下来自官方文档 请按照以下步骡排除故障&#xff1a; 确认电脑和一体机连接了相同的路由器WiFi网络(相同网段) IP地址通常为192.168.XX&#xff0c;若两设备的IP地址前三段相同&…...

        细说STM32F407单片机RTC的基本原理及闹钟和周期唤醒功能的使用方法

        目录 一、RTC基础知识 1、 RTC的功能 2、RTC工作原理 &#xff08;1&#xff09;RTC的时钟信号源 &#xff08;2&#xff09;预分频器 &#xff08;3&#xff09;实时时钟和日历数据 &#xff08;4&#xff09;周期性自动唤醒 &#xff08;5&#xff09;可编程闹钟 &a…...

        ES用脚本更新异常

        因为需要向原有的es结构中增加一个检索字段&#xff0c;但因为历史es数据都没有该字段&#xff0c;需要批量刷新es的该字段&#xff0c;本地使用了脚本的方式进行刷新&#xff0c;在测试环境测试&#xff0c;出现了以下错误&#xff1a; 500 Internal Server Error: [{"e…...

        Navicat导入海量Excel数据到数据库(简易介绍)

        目录 前言正文 前言 此处主要作为科普帖进行记录 原先Java处理海量数据的导入时&#xff0c;由于接口超时&#xff0c;数据处理不过来&#xff0c;后续转为Navicat Navicat 是一款功能强大的数据库管理工具&#xff0c;支持多种数据库系统&#xff08;如 MySQL、PostgreSQL、…...

        C++学习

        C对C语言的加强 1.命名空间&#xff08;namespace&#xff09; 为了避免&#xff0c;在大规模程序的设计中&#xff0c;以及在程序员使用各种各样的C库时&#xff0c;这些标识符的命名发送冲突。 标准C引入了关键字namespace&#xff0c;可以更好地控制标识符的作用域。 st…...

        Linux Mem -- Where the mte store and check in the real hardware platform

        目录 1 前言 2 MTE tag分类 3 Address tag 4 Memory tag 5 Tag Check 6 Cortex-A710 和 CI-700 系统示例&#xff1a; 1 前言 ARM的MTE允许分配、设置、比较一个 4bit的allocation tag 为16字节粒度的物理地址。当对MTE有一定了解后&#xff0c;应该会产生如下疑问&#…...

        老牌软件,如今依旧坚挺

        今天给大家介绍一个非常好用的老牌电脑清理软件&#xff0c;这个软件好多年之前就有人使用了。 今天找出来之后&#xff0c;发现还是那么的好用&#xff0c;功能非常强大。 Red Button 电脑清理软件 软件是绿色版&#xff0c;无需安装&#xff0c;打开这个图标就能直接使用了…...

        springboot整合modbus实现通讯

        springboot整合modbus4j实现tcp通讯 前言 本文基于springboot和modbus4j进行简单封装&#xff0c;达到开箱即用的目的&#xff0c;目前本方案仅实现了tcp通讯。代码会放在最后&#xff0c;按照使用方法操作后就可以直接使用 介绍 在使用本方案之前&#xff0c;有必要对modb…...

        【java面试】线程篇

        1.什么是线程&#xff1f; 线程是操作系统能够进行运算调度的最小单位&#xff0c;它被包含在进程之中&#xff0c;是进程中的实际运作单位。 2.线程和进程有什么区别&#xff1f; 线程是进程的子集&#xff0c;一个进程可以有很多线程&#xff0c;每条线程并行执行不同的任…...

        DeepSeek官方发布R1模型推荐设置

        今年以来&#xff0c;DeepSeek便在AI领域独占鳌头&#xff0c;热度一骑绝尘。其官方App更是创造了惊人纪录&#xff0c;成为史上最快突破3000万日活的应用&#xff0c;这一成绩无疑彰显了它在大众中的超高人气与强大吸引力。一时间&#xff0c;各大AI及云服务厂商纷纷投身其中&…...

        Vue CLI 配置与插件

        Vue CLI 配置与插件 今天我们来聊聊 Vue CLI 的配置与插件。随着项目复杂度的增加&#xff0c;合理配置 Vue CLI 可以帮助我们更高效地管理项目&#xff0c;同时利用插件机制快速集成各种功能。下面我就和大家详细介绍如何配置 Vue CLI&#xff0c;以及如何使用和开发插件&…...

        Spring Boot (maven)分页3.0版本 通用版

        前言&#xff1a; 通过实践而发现真理&#xff0c;又通过实践而证实真理和发展真理。从感性认识而能动地发展到理性认识&#xff0c;又从理性认识而能动地指导革命实践&#xff0c;改造主观世界和客观世界。实践、认识、再实践、再认识&#xff0c;这种形式&#xff0c;循环往…...

        pip 与 conda 的故事

        pip 换源 pip 官方源 -i https://pypi.python.org/simple pip 清华源 -i https://pypi.tuna.tsinghua.edu.cn/simple pip 阿里源 -i https://mirrors.aliyun.com/pypi/simple PyTorch 安装 pip3 install torch torchvision torchaudio pip3 install torch torchvision torchaud…...

        清华大学KVCache.AI团队联合趋境科技联合的KTransformers开源项目为什么那么厉害

        KTransformers是一个由清华大学KVAV.AI团队开发的开源项目&#xff0c;旨在优化大语言模型&#xff08;LLM&#xff09;的推理性能&#xff0c;特别是在有限显存资源下运行大型模型。以下是KTransformers的详细介绍&#xff1a; 1. 核心特点 高性能优化&#xff1a;KTransfor…...

        DeepSeek 遭 DDoS 攻击背后:DDoS 攻击的 “千层套路” 与安全防御 “金钟罩”_deepseek ddos

        当算力博弈升级为网络战争&#xff1a;拆解DDoS攻击背后的技术攻防战——从DeepSeek遇袭看全球网络安全新趋势 在数字化浪潮席卷全球的当下&#xff0c;网络已然成为人类社会运转的关键基础设施&#xff0c;深刻融入经济、生活、政务等各个领域。从金融交易的实时清算&#xf…...

        4090单卡挑战DeepSeek r1 671b:尝试量化后的心得的分享

        引言&#xff1a; 最近&#xff0c;DeepSeek-R1在完全开源的背景下&#xff0c;与OpenAI的O1推理模型展开了激烈竞争&#xff0c;引发了广泛关注。为了让更多本地用户能够运行DeepSeek&#xff0c;我们成功将R1 671B参数模型从720GB压缩至131GB&#xff0c;减少了80%&#xff…...

        【动态路由】系统Web URL资源整合系列(后端技术实现)【apisix实现】

        需求说明 软件功能需求&#xff1a;反向代理功能&#xff08;描述&#xff1a;apollo、eureka控、apisix、sentinel、普米、kibana、timetask、grafana、hbase、skywalking-ui、pinpoint、cmak界面、kafka-map、nacos、gateway、elasticsearch、 oa-portal 业务应用等多个web资…...

        【Elasticsearch】通过运行时字段在查询阶段动态覆盖索引字段

        在 Elasticsearch 中&#xff0c;Override field values at query time是指通过运行时字段&#xff08;runtime fields&#xff09;在查询阶段动态覆盖索引字段的值&#xff0c;而无需修改原始索引数据。这种功能特别适用于以下场景&#xff1a; 1. 动态修改字段值&#xff1a…...

        【stm32】定时器

        stm32f4xx&#xff1a; APB2 ----> TIM1,TIM8,TIM9,TIM10,TIM11 APB1 ----> TIM2,TIM3,TIM4,TIM5,TIM6,TIM7,TIM12,TIM13,TIM14 一、定时器介绍 1、基本定时器 1.1、TIM6 和 TIM7 的主要特性 ● 16 位自动重载递增计数器 ● 16 位可编程…...

        滑动窗口算法篇:连续子区间与子串问题

        1.滑动窗口原理 那么一谈到子区间的问题&#xff0c;我们可能会想到我们可以用我们的前缀和来应用子区间问题&#xff0c;但是这里对于子区间乃至子串问题&#xff0c;我们也可以尝试往滑动窗口的思路方向去进行一个尝试&#xff0c;那么说那么半天&#xff0c;滑动窗口是什么…...