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

C++ std::unordered_set

std::unordered_set 是 C++ STL 中的无序关联容器,其核心特性是存储唯一元素不保证元素顺序,底层基于哈希表实现,因此插入、查找、删除操作的平均时间复杂度为 O(1)。与 std::set(红黑树实现)相比,它更适合对查找速度有高要求且无需元素有序的场景。

1、底层数据结构与核心特性

1.1 底层数据结构

  • 底层结构哈希表(Hash Table)。
  • 核心特性
    1. 关联性:元素是键(Key)本身
    2. 无序性:容器中的元素是无序的。元素的存储顺序取决于其哈希值以及它们如何被映射到桶中。遍历集合时,元素的顺序是不确定的,并且可能在插入新元素后发生改变。
    3. 唯一性:集合中每个元素的键都是唯一的。
  • 实现原理
    • 容器维护一个桶数组(Array of Buckets)。
    • 通过一个哈希函数(Hash Function)将元素的键转换成一个哈希值(通常是一个 size_t 类型的数)。
    • 根据哈希值通过某种映射(通常是 hash_value % bucket_count)计算出该元素应该属于哪个(Bucket)。
    • 不同的键可能被映射到同一个桶中,这称为哈希冲突std::unordered_set 采用链地址法(Separate Chaining)解决冲突,即每个桶实际上是一个链表(或一个小型容器),所有映射到同一桶的元素都放在这个链表中。

1.2 核心特性与原理

  1. 平均常数时间复杂度 (O(1))

    • 在理想情况下(哈希函数均匀,冲突极少),插入、删除和查找操作的平均时间复杂度是常数级的,即 O(1)
    • 这是 unordered_set 相对于 set 最大的优势。
  2. 最坏情况时间复杂度 (O(n))

    • 在最坏情况下(例如,哈希函数极差,所有元素都冲突到同一个桶中),整个哈希表退化为一个链表,所有操作的时间复杂度都变为线性级 O(n)
    • 因此,选择一个好的哈希函数至关重要。
  3. 负载因子与重哈希(Rehashing)

    • 负载因子(Load Factor):load_factor = size() / bucket_count()。它衡量一个桶的平均元素数量,是哈希表“满”程度的指标。
    • 最大负载因子(Max Load Factor):一个阈值。当 load_factor > max_load_factor 时,容器会自动执行重哈希
    • 重哈希过程
      1. 分配一个更大的新桶数组(通常是大约两倍于原来的质数大小)。
      2. 遍历所有现有元素,根据新的桶数量重新计算每个元素的哈希值和桶索引。
      3. 将所有元素插入到新的桶数组中。
      4. 释放旧的桶数组。
    • 重哈希是一个开销很大的操作,会导致所有迭代器失效
  4. 迭代器不稳定性

    • 插入操作可能会导致重哈希,从而使所有迭代器失效
    • 删除操作只会使指向被删除元素的迭代器失效。

2. 操作指导与代码示例

2.1 初始化与构造函数

#include <unordered_set>
#include <iostream>// 1. 空unordered_set
std::unordered_set<int> uset1;// 2. 使用初始化列表 (C++11)
std::unordered_set<int> uset2 = {5, 2, 8, 1, 2, 4}; // 重复的2会被忽略 -> {1, 2, 4, 5, 8} (顺序不确定!)// 3. 通过迭代器范围(另一个容器的)
std::vector<int> vec = {6, 7, 7, 8, 1};
std::unordered_set<int> uset3(vec.begin(), vec.end()); // {1, 6, 7, 8} (顺序不确定)// 4. 指定初始桶数量(用于性能调优)
std::unordered_set<std::string> uset4(100); // 创建时约有100个桶// 5. 拷贝构造函数
std::unordered_set<int> uset5(uset2);

2.2 元素访问与查找

std::unordered_set<std::string> fruits = {"apple", "banana", "orange"};// 1. find: 查找元素,返回迭代器
auto it = fruits.find("banana");
if (it != fruits.end()) {std::cout << "Found: " << *it << "\n";
} else {std::cout << "Not found\n";
}// 2. count: 检查存在性,对于set只能是0或1
if (fruits.count("apple") > 0) {std::cout << "Apple is in the set\n";
}// 3. 访问桶接口(高级用法,通常用于调试)
size_t bucket_index = fruits.bucket("apple"); // "apple" 所在的桶的索引
size_t bucket_size = fruits.bucket_size(bucket_index); // 该桶中有多少个元素
std::cout << "'apple' is in bucket #" << bucket_index << " which has " << bucket_size << " elements.\n";

2.3 增加元素

std::unordered_set<int> uset;// 1. insert: 插入一个值
std::pair<std::unordered_set<int>::iterator, bool> ret1 = uset.insert(100);
if (ret1.second) {std::cout << "Insertion of 100 succeeded.\n";
}// 2. emplace: 原地构造,避免临时对象,更高效
// 直接传递构造参数给emplace
auto ret2 = uset.emplace(200);
if (ret2.second) {std::cout << "Emplace of 200 succeeded.\n";
}// 3. 插入提示版本(效率提升有限,因为unordered_set的插入位置由哈希决定)
uset.insert(uset.begin(), 300); // 提示通常被忽略

2.4 删除元素

std::unordered_set<int> uset = {10, 20, 30, 40, 50};// 1. erase by key: 删除键为30的元素,返回删除的元素个数(0或1)
size_t numErased = uset.erase(30); // numErased = 1// 2. erase by iterator: 删除指定位置的元素,更高效
auto it = uset.find(20);
if (it != uset.end()) {uset.erase(it);
}// 3. erase by range: 删除一个区间的元素 [first, last)
// (不常用,因为元素无序)
auto first = uset.find(40);
auto last = uset.end();
uset.erase(first, last); // 删除40和50

2.5 遍历元素

std::unordered_set<std::string> uset = {"apple", "banana", "cherry", "date"};// 1. 范围for循环 (最常用)
std::cout << "Elements: ";
for (const auto& elem : uset) {std::cout << elem << " ";
}
// 输出顺序不确定,可能是: date apple cherry banana
std::cout << "\n";// 2. 使用迭代器
for (auto it = uset.begin(); it != uset.end(); ++it) {std::cout << *it << " ";
}
std::cout << "\n";// 注意:遍历顺序是无意义的,并且可能随时间(插入/删除)而改变。

2.6 容量与性能管理

std::unordered_set<int> uset;// 1. 预留空间:避免多次重哈希,提升性能
uset.reserve(1000); // 预留至少能容纳1000个元素的空间,容器会自动选择足够的桶数// 2. 重哈希:手动控制,强制将桶数调整为至少 n
uset.rehash(500); // 强制桶数 >= 500// 3. 查看当前状态
std::cout << "Size: " << uset.size() << "\n";
std::cout << "Bucket count: " << uset.bucket_count() << "\n"; // 桶的数量(通常是质数)
std::cout << "Load factor: " << uset.load_factor() << "\n"; // 当前负载因子
std::cout << "Max load factor: " << uset.max_load_factor() << "\n"; // 最大负载因子(默认~1.0)// 4. 修改最大负载因子
uset.max_load_factor(0.75f); // 设置更小的最大负载因子,减少冲突概率,但可能增加内存使用

2.7 自定义类型作为键

要让自定义类型(如MyClass)作为 unordered_set 的键,你需要为其定义两个东西:

  1. 哈希函数:告诉容器如何计算对象的哈希值。
  2. 相等比较函数:告诉容器如何判断两个对象是否相等。
2.7.1 特化 std::hash 模板并重载 operator==(推荐,最简洁)
struct Person {std::string name;int age;// 1. 必须重载 operator==bool operator==(const Person& other) const {return name == other.name && age == other.age;}
};// 2. 打开std命名空间,特化std::hash模板
namespace std {template<>struct hash<Person> {size_t operator()(const Person& p) const {// 组合各个成员的哈希值(这是一个简单示例,更好的方法见下文)return hash<std::string>()(p.name) ^ (hash<int>()(p.age) << 1);}};
}// 现在可以直接使用
std::unordered_set<Person> personSet;
personSet.insert({"Alice", 25});
personSet.insert({"Bob", 30});
2.7.2 提供自定义的哈希器和相等比较器作为模板参数
struct Person {std::string name;int age;
};// 自定义哈希器
struct PersonHash {size_t operator()(const Person& p) const {// 更好的哈希组合方式:使用现成的hash_combine技术size_t h1 = std::hash<std::string>{}(p.name);size_t h2 = std::hash<int>{}(p.age);return h1 ^ (h2 << 1);}
};// 自定义相等比较器
struct PersonEqual {bool operator()(const Person& a, const Person& b) const {return a.name == b.name && a.age == b.age;}
};// 使用时必须将两个比较器作为模板参数传入
std::unordered_set<Person, PersonHash, PersonEqual> personSet;
2.7.3 更好的哈希组合方法(Boost风格)
// 一个通用的哈希组合函数
template <class T>
inline void hash_combine(std::size_t& seed, const T& v) {std::hash<T> hasher;seed ^= hasher(v) + 0x9e3779b9 + (seed<<6) + (seed>>2);
}// 在自定义哈希器中使用
struct PersonHash {size_t operator()(const Person& p) const {std::size_t seed = 0;hash_combine(seed, p.name);hash_combine(seed, p.age);return seed;}
};

3、常见问题

  1. std::unordered_set 的底层实现是什么?**
    底层是哈希表。它维护一个桶数组,通过哈希函数将键映射到桶的索引,并使用链地址法解决哈希冲突。

  2. 什么是哈希冲突?unordered_set 是如何解决它的?**
    哈希冲突是指不同的键被哈希函数映射到了同一个桶中。std::unordered_set 采用链地址法解决冲突,即每个桶是一个链表,所有映射到同一桶的元素都放在这个链表中。

  3. 什么是重哈希(Rehashing)?什么时候会发生?**
    重哈希是哈希表扩容的过程。当当前负载因子(size() / bucket_count())超过最大负载因子(max_load_factor())时,容器会自动执行重哈希:分配一个更大的新桶数组,并重新映射所有元素。重哈希会导致所有迭代器失效

  4. 如何让一个自定义类型可以作为 unordered_set 的键?**
    需要提供两个东西:
    1. 哈希函数:通过特化 std::hash 模板或提供自定义的哈希函数对象。
    2. 相等比较函数:通过重载 operator== 或提供自定义的相等比较函数对象。

  • Q: unordered_set 的迭代器在插入操作后会失效吗?
    • A: 可能会。如果插入操作导致重哈希发生,那么所有迭代器都会失效。如果没有导致重哈希,则插入操作不会使迭代器失效。
  1. 什么时候应该选择 unordered_set 而不是 set?**
    当你需要极快的查找速度(平均O(1)),并且不关心元素的顺序时,应该选择 unordered_set。当你需要元素有序,或者需要进行范围查询,或者担心最坏情况的性能时,应该选择 set

  2. 如何提高 unordered_set 的性能?**
    主要有几种方法:

    1. 在插入大量元素之前,使用 reserve(n) 预分配足够空间,避免多次重哈希。
    2. 提供一个高质量、低冲突的哈希函数。
    3. 适当调整 max_load_factor()(通常降低它可以减少冲突,但会增加内存使用)。
  3. 什么是负载因子(Load Factor)?它对 std::unordered_set 性能有何影响?
    负载因子 = 元素数量 / 桶数量。它是衡量哈希表拥挤程度的指标:

    • 负载因子过小:桶数量过多,浪费内存。
    • 负载因子过大:哈希冲突率高,桶内链表/红黑树变长,操作效率退化。
      std::unordered_set 默认最大负载因子为 1.0,超过时会触发 rehash(扩容桶)。
  4. std::unordered_set 的迭代器为什么是前向迭代器而不是双向迭代器?
    因为哈希表的桶内元素通过单链表(或红黑树)存储,单链表仅支持前向遍历(++),不支持反向遍历(--)。即使桶内用红黑树,整体哈希表的无序性也使得双向迭代意义不大,因此标准定为前向迭代器。

  5. 如何避免 std::unordered_set 的 rehash 操作?
    提前通过 reserve(n) 预留足够的桶数量(确保 n 大于预期最大元素数),使元素数不会超过 max_load_factor() * bucket_count(),从而避免自动 rehash。例如:

    unordered_set<int> us;
    us.reserve(1000);  // 预计存储 1000 个元素,提前预留桶
    

相关文章:

C++ std::unordered_set

std::unordered_set 是 C++ STL 中的无序关联容器,其核心特性是存储唯一元素且不保证元素顺序,底层基于哈希表实现,因此插入、查找、删除操作的平均时间复杂度为 O(1)。与 std::set(红黑树实现)相比,它更适合对查找速度有高要求且无需元素有序的场景。 1、底层数据结构与…...

如何将一个项目同时提交到GitHub和Gitee(码云)上

要将本地的一个项目同时提交到 GitHub 和 Gitee,可以通过配置多个远程仓库来实现,以下是具体步骤: 前提条件 确保你已经在 GitHub 和 Gitee 上分别创建了空的远程仓库,并且本地已经安装配置好了 Git,能够正常使用 Git 命令行进行操作。 操作步骤初始化本地仓库(如果还未初…...

基于Matlab的LeNet-5车牌字符识别系统实现

一、网络结构改进方案输入层调整输入尺寸:将LeNet-5原始输入尺寸(3232)调整为车牌字符标准尺寸(2828或4848) 通道扩展:增加颜色通道(RGB→灰度需归一化,或保留RGB通道)卷积层优化 layers = [imageInputLayer([28 28 1]) % 输入层convolution2dLayer(5, 6, Padding, sa…...

MATLAB的交通标志牌识别实现

MATLAB的交通标志牌识别实现,使用了颜色分割、形态学处理、模板匹配等核心技术一、核心识别流程设计图像预处理 灰度化与去噪 色彩空间转换(RGB→HSV/Lab) 颜色阈值分割(红色/蓝色/黄色区域提取) 几何特征提取 边缘检测(Canny算子) 形态学操作(腐蚀+膨胀) 轮廓分析(筛…...

Python常见的数据结构和代码示例

概述 Python 中常见的数据结构可以分为内置数据结构和扩展数据结构(主要来自第三方库)两类,以下是详细介绍: 一、内置数据结构(Python 自带) 这些是 Python 解释器原生支持的数据结构,无需额外导入模块。 1. 列表(List)特点:有序、可变(可修改)、允许重复元素,可存…...

Grafana 中文入门教程 | 构建你的第一个仪表盘

在大厂工作久了,时常对一些工具的存在觉得理所当然。 比如说,需要计算资源的时候,一个配置文件就可以要来两百台虚拟化好的机子。需要试下缓存?点下鼠标就可以要到几十个配置好的 Redis 结点。 最省心的是,这些工具都已经根据工作流配置好了:鉴权、优化、网络连接等等通通…...

Gitee DevOps:中国开发者效率革命的数字引擎

Gitee DevOps:中国开发者效率革命的数字引擎 在数字化转型浪潮席卷全球的当下,中国软件产业正面临前所未有的效率挑战。传统开发模式中的人工干预、碎片化工具链和低效协作已成为制约企业创新速度的关键瓶颈。Gitee DevOps作为本土领先的一站式开发运维平台,通过全流程自动化…...

Topaz Photo AI Pro 4.0.4 AI图片智能降噪

描述 Topaz Photo AI是一款专业的人工智能图片降噪软件,得益于Topaz公司AI算法,这款照片修复软件可以在修复照片的同时运用人工智能算法AI模型计算图片模糊部分,自动修复图片受损的细节,以增强图片画质。利用未来的技术锐化、消除噪点并提高照片的分辨率。Topaz Photo AI 可…...

C++ std::map

std::map 是 C++ STL 中最常用的有序键值对容器,其核心功能是存储唯一键(key)与对应值(value)的映射关系,并自动按键的顺序排序。底层基于红黑树(自平衡二叉搜索树)实现,这使得它在键的查找、插入、删除等操作上保持稳定的高效性。 1、底层数据结构与核心特性 1.1 底层…...

易基因:Nat Genet/IF29:董朝斌团队ChIP-seq等揭示作物株型穗型发育调控新机制 助力表观遗传育种驯化改良(顶刊佳作)

大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。 近日,中国农业大学玉米生物育种全国重点实验室董朝斌教授为第一及共同通讯作者,美国加州大学伯克利分校George Chuck研究员为共同通讯作者,在国际遗传学Top期刊《Nature Genetics》发表了题为“A regulator…...

Edge浏览器网页长截图

长截图步骤1.在Edge浏览器中打开目标网页(需确保网页完全加载后再截图,否则可能截取不完整)‌‌2.按下‌Ctrl+Shift+S‌组合键3.选择截屏模式‌为捕获整页‌(自动滚动并截取整个网页,生成一张长图)‌‌4.截图后可直接复制或保存为图片文件...

Python TensorFlow的CNN-LSTM-GRU集成模型在边缘物联网数据IoT电动汽车充电站入侵检测应用

全文链接:https://tecdat.cn/?p=43881原文出处:拓端抖音号@拓端tecdat随着物联网(IoT)技术在电动汽车充电站(EVCS)中的普及,充电站不仅成为智能交通的关键节点,更因连接电网、用户设备与管理系统,成为网络攻击的重点目标。传统入侵检测系统(IDS)要么难以处理IoT环境…...

C++多线程编程—线程控制、同步与互斥详解

本文将深入探讨C++多线程编程中的核心概念:线程控制、同步与互斥。 1.线程控制:join 与 detach当我们创建一个线程(std::thread)后,我们必须明确在这个线程对象销毁之前,如何管理它所代表的执行线程。这就是 join 和 detach 的用武之地。join()作用:阻塞当前线程(通常是…...

MySQL启动失败:mysqld.log Permis 报错处理.250916

报错:Could not open file /var/log/mysqld.log for error logging: Permis 解决办法: sudo setenforce 0 systemctl restart mysqld systemctl status mysqld如果好了,就更改selinux策略: sudo semanage fcontext -a -t mysqld_db_t "/home/mysql/data(/.*)?" …...

源码管理—密钥硬编码问题

源码管理—密钥硬编码问题目录密钥硬编码的定义: 指在代码、配置里硬编码密码/明文密码在配置文件中,但是不论是通过 AES 加密过的密码,还是将明文密码存储在远程配置文件中,都属于硬编码密钥。 常见的密钥硬编码场景:密钥放在环境变量 密钥加密存储在代码里 密钥放在服务…...

无速度传感器交流电机的扩展Luenberger观测器

扩展Luenberger观测器是一种用于无速度传感器交流电机控制的重要技术,它能够估计电机的内部状态(如转子磁链)和转速。 理论背景 对于感应电机,在静止α-β坐标系下的模型可以表示为: 状态方程: dx/dt = A(ω)x + Bu y = Cx其中: x = [isα, isβ, ψrα, ψrβ]^T u = […...

AI Ping体验记:终于有人做大模型服务的“性能监控”了

引言 最近几个月,我们公司在开发AI应用平台并集成到现有系统中。作为项目的技术选型负责人,我被MaaS平台API的选择问题折磨得不轻。面对市面上众多的大模型服务商,如何选出最适合我们的那一个,真的是个大难题。 市面上的MaaS平台越来越多,光是国内的就有20多家,这还是我知…...

数据库原理-第二章——关系型数据库

pass...

mac 的任务栏 Windows-Style Taskbar For macOS

https://lawand.io/taskbar/...

快手Java一面

线程池七大参数和作用?有大量执行时间短的任务如何设置线程池参数? Synchronized和ReentrantLock实现上的区别?哪个能尝试获取锁?tryLock方法参数是什么?返回是什么? ReentrantLock的公平锁和非公平锁怎么实现的? JVM堆内存怎么划分的? CMS垃圾回收机制下新生代和老年代…...

详细介绍:Elastic APM 入门指南:快速设置应用性能监控

详细介绍:Elastic APM 入门指南:快速设置应用性能监控pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", mon…...

想找Axure替代?这6个原型设计工具值得一试

引言 在原型设计工具里,Axure可以说是最为经典、老牌的一款了。它在产品圈内有着较高的知名度和地位,但随着工具生态的不断丰富,越来越多产品经理在学习和使用Axure的过程中,逐渐放弃转为寻找Axure替代工具。其实,如今想找到能替代Axure的工具并不难,本文就为大家介绍6款…...

H5游戏性能优化系列-----cpu相关优化

cpu优化主要是优化cpu使用率,帧率平稳性(卡帧,长耗时任务),主要从以下几个方面优化设置合适的帧率。根据游戏类型设置合适的帧率,比如slg,回合制这种类型游戏一般开30帧,mmo等即时战斗的或者对流畅度有很高要求的可以开60帧。 帧同步与状态同步的抉择。一般来说状态同步会…...

IPA 混淆实战 IPA 混淆、IPA 加固、ipa 文件安全与成品包防护全流程指南

本文详解 IPA 混淆实战:为何做 ipa 混淆、Ipa Guard 在成品包加固中的角色、与源码混淆的区别、工具链(MobSF、class-dump、Frida)验证流程,以及灰度发布、白名单与映射表管理等落地经验,面向开发与安全团队。在移动应用交付链中,“源码混淆”与“成品 IPA 混淆”是两条互…...

实用指南:javaweb HTML基本介绍/常见标签

实用指南:javaweb HTML基本介绍/常见标签pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !impor…...

文档处理控件Aspose.Words教程:在 C# 中将 Markdown 转换为 PDF

Markdown 被广泛用于使用纯文本语法创建格式化文本。许多开发人员喜欢用它来编写文档、注释和内容格式。然而,我们经常需要将Markdown文档生成专业的PDF文件。本文将学习如何借助Aspose.words for .NET,使用 C# 将 Markdown 转换为 PDF。Markdown 被广泛用于使用纯文本语法创…...

TCP协议与wireshark

...

docker容器mysql导入sql文件

sudo docker exec -i mysql8 mysql -u root -pSxygsj123 whpt_specialwork < /opt/sql/whpt-specialwork.sql...

ObjectSense 包与模块:代码组织的艺术

在编程世界中,随着项目规模扩大,代码的组织管理变得至关重要。ObjectSense 引入了包(Package)和模块(Module)机制,为代码的结构化管理提供了完美解决方案。 包:代码的基础组织单元 包是 ObjectSense 中最基础的代码组织形式,它通过目录结构与逻辑结构的统一,解决了命…...

IDE工具RAD Studio 13 Florence重磅发布:64 位 IDE + AI 组件全面升级!

近日,Embarcadero 正式宣布推出 RAD Studio 13 Florence,同时发布了 Delphi 13 与 C++Builder 13。这一版本带来了 全新的 64 位 RAD Studio IDE、更新的 C++Builder Clang 编译器、全新 Delphi 语言扩展、AI 组件与 AI 助手,并对现有功能进行了全面增强,重点聚焦在 质量与…...

C# 批量修改数据库

我这里有个例子,是整合数据后批次写入数据库的,只连接一次,希望对你有帮助using (SqlBulkCopy bc = new SqlBulkCopy(conn, SqlBulkCopyOptions.Default, trans)){bc.DestinationTableName = "ExamDetails";//要插入的表的表名bc.BatchSize = 10000;bc.ColumnMapp…...

Job for network.service failed because the control process exited with error code.

问题描述:VMware workstation 安装centos7启动后修改网络ip无效,报错;启动后主机还会蓝屏。 原因:windows10/11需要适配VMware workstation 16及以上,并打开虚拟配置。 解决方案:官网下载安装VMware workstation 17,17已经对个人免费。 新建虚拟机时,设置处理器》开启虚…...

负荷聚类及其在MATLAB中的实现

一、什么是负荷聚类? 负荷聚类 是指通过对用户或测量点的用电负荷数据(通常是功率随时间变化的曲线,即“负荷曲线”)进行处理和分析,根据其用电模式的相似性,自动地将它们划分为不同的类别(簇)。目标:发现数据中内在的、未知的分组模式,实现“物以类聚”。 输入:多个…...

移动安全框架(MobSF)静态分析入门指南

本文详细介绍了如何使用Mobile Security Framework(MobSF)进行移动应用静态安全分析,包含环境搭建、代码克隆、权限配置和基础扫描流程,适合移动安全入门人员学习实践。移动安全框架(MobSF)静态分析第一部分 这是一个用于分析移动应用的强大框架。在本博客中,我们将学习…...

列表项点击,逻辑梳理

列表项点击,从viewHolder >> adapter >> fragment,理清关系了。 mClickListener是传过来的,MyRecordViewHolder << MyRecordPageAdapter << MyRecordPage 最终在presenter中执行...

CRMEB标准版PHP批量发货功能深度解析

订单批量发货,批量发出当前需要发货的订单 1、导出发货单 点击批量发货—>导出发货单。注:导出发货单无需选择订单,只会导出当前待发货(不包含虚拟商品)的订单列表 2、完善发货单 导出的excel发货单中填写订单对应的快递名称,快递编码,快递单号 3、导入发货单 将填写…...

数学之美 第一章读后感

作者从人类远古时期讲起,首先指出古人传情达意的方式与如今通信方式并无差别的观点。从埃及的象形文字开始,因表意文字的增加,古人开始采用一字多意,而读者不产生歧义的话就需要联系上下文,这与解码与机器学习的原理相差不大。对于数字的发展,人类根据手指数量发明了十进…...

【SPIE出版】第九届交通工程与运输系统国际学术会议(ICTETS 2025)

第九届交通工程与运输系统国际学术会议(ICTETS 2025)将由大连理工大学主办,大连理工大学建设工程学院交通运输系承办,于2025年9月26-28日在大连隆重召开。【SPIE独立出版!连续多年EI稳定检索!】 【大连理工大学主办!】 第九届交通工程与运输系统国际学术会议(ICTETS 20…...

模型上下文协议(Model Context Protocol,MCP)

一. MCP 概述 模型上下文协议(Model Context Protocol,MCP),是由Anthropic推出的开源协议,旨在实现大语言模型与外部数据源和工具的集成,用来在大模型和数据源之间建立安全双向的连接。 模型上下文协议是专为高效获得模型所需要上下文信息而设计的通用接口,可以将推动大…...

大华设备视频平台EasyCVR视频分析设备平台双轨视频数据存储方案全解读

大华设备视频平台EasyCVR视频分析设备平台双轨视频数据存储方案全解读随着物联网、AI、云计算、大数据等新兴技术的发展、海量设备的接入、视频质量的不断提升,监控视频存储也面临着巨大的挑战。当前用户对视频监控数据的存储问题,主要考虑到以下三个因素: 1)数据的安全性和…...

AI音乐创作新突破:ACE-Step模型开启放克音乐智能生成时代

AI音乐创作新突破:ACE-Step模型开启放克音乐智能生成时代 专业级音乐创作进入AI时代 近日,Gitee AI平台正式开源其创新性音乐生成模型ACE-Step,这一技术突破将彻底改变专业音乐创作的生产方式。该模型通过深度学习算法实现了从歌词到完整编曲的端到端生成,特别在流行放克(F…...

【ABSR出版】第二届农业工程与生物学国际研讨会(ISAEB 2025)

第二届农业工程与生物学国际研讨会(ISAEB 2025)将于2025年9月26日至28日在马来西亚吉隆坡举行。【农业、生物会议 | 马来西亚国际会议】 【Scopus, CNKI, Google Scholar, Inspec (IET)检索】 第二届农业工程与生物学国际研讨会(ISAEB 2025) 2025 2nd International Symposiu…...

符号执行技术实践-求解程序密码

符号执行是什么 符号执行(Symbolic Execution)是一种程序分析技术,它使用符号值而不是具体的数值来执行程序。与传统的程序执行不同,符号执行将程序的输入用符号变量表示,然后沿着程序的执行路径收集这些符号变量必须满足的约束条件。 如果我们把普通的程序执行比作用具体的…...

博客皮肤

https://www.yuque.com/awescnb...

低轨卫星跟踪对星方式

低轨卫星跟踪对星方式 参考 https://zhuanlan.zhihu.com/p/1934304295236400209 低轨卫星的跟踪参考 https://zhuanlan.zhihu.com/p/1937283578066076622 遥测自跟踪天线低轨卫星对星的关键技术点 低轨(LEO)卫星的特点是轨道高度低(通常在200km至2000km之间),比如Starlin…...

开源中国社区发布AI赋能2.1版本:打造企业级私有化知识中枢新范式

开源中国社区发布AI赋能2.1版本:打造企业级私有化知识中枢新范式 在数字化转型浪潮席卷全球的当下,开源中国(OSCHINA.NET)正式推出社区2.1版本,以"私有化部署+AI智能引擎"为核心,重新定义企业知识管理的技术边界。这一重大升级标志着国内领先的技术社区从传统内…...

PL/SQL 性能优化指南

PL/SQL 性能优化指南 本文系统梳理了在SQL编写和PL/SQL程序设计中常见的性能问题,并提供可落地的优化策略,帮助开发者写出更高效、更稳定的数据库代码。一、表连接与解析顺序优化 1. 选择最优的表名顺序(适用于RBO,现代已不敏感但建议保留习惯) Oracle在基于规则的优化器(…...

jdbcType-java 类型

在 JDBC 中,jdbcType 用于指定数据库字段的数据类型,确保 Java 类型与数据库类型正确映射。MyBatis 等持久层框架常使用 jdbcType 处理参数和结果集的类型转换。以下是常见的 jdbcType 类型及其说明:JDBC 类型对应 Java 类型说明常见数据库映射示例ARRAY java.sql.Array 数据…...

支配对

本质思路是,通过可接受复杂度个支配对来表示所有点对。找支配对的核心条件是,在任何情况下其他点对都会被支配对淘汰。找支配对往往有两个限制,一是值是否更优,二是是否更容易满足限制。这相当于一个二维偏序问题,只不过我们要自己找偏序的对象。 在序列上,一般是区间问题…...

macOS Sonoma 14.8 (23J21) 正式版 ISO、IPSW、PKG 下载

macOS Sonoma 14.8 (23J21) 正式版 ISO、IPSW、PKG 下载macOS Sonoma 14.8 (23J21) 正式版 ISO、IPSW、PKG 下载 利用小组件进行个性化设置、令人眼前一亮的全新屏幕保护、Safari 浏览器和视频会议的重大更新 请访问原文链接:https://sysin.org/blog/macOS-Sonoma/ 查看最新版…...