【C++重载操作符与转换】下标操作符
目录
一、下标操作符重载基础
1.1 什么是下标操作符重载
1.2 默认行为与需求
1.3 基本语法
二、下标操作符的核心实现策略
2.1 基础实现:一维数组模拟
2.2 多维数组实现:矩阵类示例
三、下标操作符的高级用法
3.1 自定义索引类型:字符串键映射
3.2 代理对象:实现惰性求值或位级操作
四、下标操作符的边界与异常处理
4.1 常见错误场景
4.2 最佳实践
五、下标操作符的性能优化
5.1 返回值优化(RVO)
5.2 代理对象的开销控制
5.3 示例:高性能位向量
六、下标操作符重载的应用场景
七、下标操作符与标准库的交互
7.1 与std::map的对比
7.2 与std::vector的代理模式
八、总结
8.1 核心原则
8.2 常见陷阱与解决方案
九、附录:操作符重载对比表
在 C++ 编程里,操作符重载是一项强大的特性,它能够让我们自定义类的行为,使其操作更符合直觉和业务需求。其中,下标操作符 []
的重载尤为重要,它使得我们可以像访问数组元素一样访问自定义类对象的元素,极大地提升了代码的可读性和可维护性。
一、下标操作符重载基础
1.1 什么是下标操作符重载
下标操作符 []
在 C++ 中常用于访问数组元素。例如,对于数组 int arr[5]
,我们可以使用 arr[2]
来访问数组的第三个元素。当我们定义自定义类时,通过重载下标操作符,就能让类对象以类似数组的方式进行元素访问。
1.2 默认行为与需求
对于内置数组,下标操作符由语言本身定义。但对于自定义类,编译器不会自动提供下标操作符的功能。如果我们希望自定义类对象能够像数组一样使用下标访问元素,就需要手动重载下标操作符。
1.3 基本语法
下标操作符重载函数的基本语法如下:
class ClassName {
public:// 重载下标操作符,用于非 const 对象ReturnType& operator[](IndexType index) {// 实现元素访问逻辑return element;}// 重载下标操作符,用于 const 对象const ReturnType& operator[](IndexType index) const {// 实现元素访问逻辑return element;}
};
ReturnType
是返回元素的类型,通常为引用类型,这样可以支持对元素的读写操作。IndexType
是下标的类型,一般为整数类型。- 提供
const
和非const
版本的重载函数,是为了保证const
对象也能使用下标操作符进行元素访问,且不能修改元素。
二、下标操作符的核心实现策略
2.1 基础实现:一维数组模拟
#include <iostream>
#include <stdexcept> // for std::out_of_range
using namespace std;class IntArray {
private:int* data;size_t size;
public:IntArray(size_t s) : size(s), data(new int[s]()) {}~IntArray() { delete[] data; }// 非const下标操作符int& operator[](size_t index) {if (index >= size) {throw out_of_range("Index out of range");}return data[index];}// const下标操作符const int& operator[](size_t index) const {if (index >= size) {throw out_of_range("Index out of range");}return data[index];}void print() const {for (size_t i = 0; i < size; ++i) {cout << data[i] << " ";}cout << endl;}
};int main() {IntArray arr(5);for (int i = 0; i < 5; ++i) arr[i] = i * 10;arr.print(); // 输出: 0 10 20 30 40try {cout << arr[10] << endl; // 抛出out_of_range异常} catch (const out_of_range& e) {cerr << "Error: " << e.what() << endl;}const IntArray& c = arr;cout << c[2] << endl; // 输出: 20(调用const版本)return 0;
}
2.2 多维数组实现:矩阵类示例
class Matrix {
private:double** data;size_t rows, cols;
public:Matrix(size_t r, size_t c) : rows(r), cols(c) {data = new double*[r];for (size_t i = 0; i < r; ++i) {data[i] = new double[c]();}}~Matrix() {for (size_t i = 0; i < rows; ++i) delete[] data[i];delete[] data;}// 行代理类:实现链式下标操作class RowProxy {private:double* rowData;public:RowProxy(double* row) : rowData(row) {}double& operator[](size_t col) {return rowData[col];}const double& operator[](size_t col) const {return rowData[col];}};// 非const下标操作符:返回行代理RowProxy operator[](size_t row) {return RowProxy(data[row]);}// const下标操作符const RowProxy operator[](size_t row) const {return RowProxy(data[row]);}void print() const {for (size_t i = 0; i < rows; ++i) {for (size_t j = 0; j < cols; ++j) {cout << data[i][j] << " ";}cout << endl;}}
};int main() {Matrix mat(3, 3);mat[0][0] = 1.0; mat[0][1] = 2.0; mat[0][2] = 3.0;mat[1][0] = 4.0; mat[1][1] = 5.0; mat[1][2] = 6.0;mat[2][0] = 7.0; mat[2][1] = 8.0; mat[2][2] = 9.0;mat.print();/* 输出:1 2 34 5 67 8 9*/mat[1][1] = 10.0; // 修改元素cout << mat[1][1] << endl; // 输出: 10const Matrix& c = mat;cout << c[2][2] << endl; // 输出: 9(调用const版本)return 0;
}
三、下标操作符的高级用法
3.1 自定义索引类型:字符串键映射
#include <string>
#include <unordered_map>
#include <iostream>
using namespace std;class StringMap {
private:unordered_map<string, int> data;
public:// 自定义索引类型:stringint& operator[](const string& key) {return data[key]; // 底层使用std::unordered_map的operator[]}// const版本const int& operator[](const string& key) const {auto it = data.find(key);if (it == data.end()) {throw out_of_range("Key not found");}return it->second;}void print() const {for (const auto& pair : data) {cout << pair.first << ": " << pair.second << endl;}}
};int main() {StringMap map;map["apple"] = 10;map["banana"] = 20;cout << map["apple"] << endl; // 输出: 10try {cout << map["orange"] << endl; // 抛出out_of_range} catch (const out_of_range& e) {cerr << "Error: " << e.what() << endl;}const StringMap& c = map;cout << c["banana"] << endl; // 输出: 20return 0;
}
3.2 代理对象:实现惰性求值或位级操作
示例:std::vector<bool>
的代理模式
#include <vector>
#include <iostream>
using namespace std;class BitVector {
private:vector<unsigned char> data;size_t size;class BitProxy {private:BitVector& parent;size_t index;public:BitProxy(BitVector& p, size_t i) : parent(p), index(i) {}// 转换为bool(读取)operator bool() const {size_t byteIndex = index / 8;size_t bitIndex = index % 8;return (parent.data[byteIndex] & (1 << bitIndex)) != 0;}// 赋值操作符(写入)BitProxy& operator=(bool val) {size_t byteIndex = index / 8;size_t bitIndex = index % 8;if (val) {parent.data[byteIndex] |= (1 << bitIndex);} else {parent.data[byteIndex] &= ~(1 << bitIndex);}return *this;}};public:BitVector(size_t s) : size(s), data((s + 7) / 8) {}BitProxy operator[](size_t index) {return BitProxy(*this, index);}bool operator[](size_t index) const {size_t byteIndex = index / 8;size_t bitIndex = index % 8;return (data[byteIndex] & (1 << bitIndex)) != 0;}void print() const {for (size_t i = 0; i < size; ++i) {cout << (*this)[i] << " ";}cout << endl;}
};int main() {BitVector bv(10);bv[0] = true;bv[1] = false;bv[2] = true;bv.print(); // 输出: 1 0 1 0 0 0 0 0 0 0cout << bv[2] << endl; // 输出: 1(调用const版本)return 0;
}
四、下标操作符的边界与异常处理
4.1 常见错误场景
- 越界访问:未检查索引范围,导致未定义行为。
const
对象修改:缺少const
版本,或const
版本返回非const
引用。- 链式调用歧义:多维数组中未正确设计代理类,导致语法错误。
4.2 最佳实践
1. 显式边界检查
int& operator[](size_t index) {if (index >= size) {throw out_of_range("Index " + to_string(index) + " out of range [0," + to_string(size - 1) + "]");}return data[index];
}
2. 区分const
和非const
版本
class Container {
private:int* data;
public:// 非const版本:返回引用int& operator[](size_t index) { return data[index]; }// const版本:返回const引用const int& operator[](size_t index) const { return data[index]; }
};
3. 使用at()
方法作为替代
class SafeContainer {
private:int* data;
public:int& at(size_t index) {if (index >= size) throw out_of_range("...");return data[index];}// 类似实现const版本
};
优势:
- 避免与
operator[]
的隐式插入行为混淆(如std::map
)。 - 显式表达意图(安全访问)。
五、下标操作符的性能优化
5.1 返回值优化(RVO)
- 避免拷贝:返回引用(
T&
或const T&
),而非值。 - 内联函数:标记
inline
(或隐式内联),减少调用开销。
5.2 代理对象的开销控制
- 避免虚函数:代理类中的操作符应为非虚函数。
- 移动语义:若代理对象需存储数据,可支持移动赋值。
5.3 示例:高性能位向量
class FastBitVector {
private:alignas(64) vector<uint64_t> data; // 64字节对齐,提升SIMD性能
public:bool operator[](size_t index) const {size_t wordIndex = index / 64;size_t bitIndex = index % 64;return (data[wordIndex] >> bitIndex) & 1;}// ... 其他优化 ...
};
- 对齐优化:
alignas(64)
确保缓存行对齐,减少伪共享。 - 位运算:使用移位和掩码替代除法/取模,提升性能。
六、下标操作符重载的应用场景
- 自定义容器类:在实现自定义容器类(如链表、栈、队列等)时,下标操作符重载可以让用户像使用数组一样方便地访问容器中的元素。
- 矩阵类:对于矩阵类,下标操作符可以用来访问矩阵的特定行和列的元素,增强代码的可读性。
- 多维数组模拟:可以使用下标操作符重载来模拟多维数组,让用户可以使用多个下标来访问元素。
七、下标操作符与标准库的交互
7.1 与std::map
的对比
特性 | std::map::operator[] | 自定义operator[] |
---|---|---|
键不存在时 | 插入默认构造的值 | 可抛出异常或返回代理对象 |
返回值类型 | 非const 引用(允许插入) | 可灵活控制(值、引用、代理) |
const 版本 | 仅读(若键存在) | 需显式实现 |
7.2 与std::vector<bool>
的代理模式
- 标准库实现:
std::vector<bool>::operator[]
返回std::vector<bool>::reference
代理对象。 - 自定义实现:可扩展为支持范围查询、原子操作等。
八、总结
8.1 核心原则
①安全性:
- 始终实现
const
版本,避免const
对象修改。 - 显式边界检查,或使用
at()
方法。
②灵活性:
- 支持自定义索引类型(如字符串、枚举)。
- 通过代理模式实现惰性求值或位级操作。
③性能:
- 返回引用,避免拷贝。
- 优化底层数据结构(如位向量、对齐存储)。
8.2 常见陷阱与解决方案
陷阱 | 解决方案 |
---|---|
越界访问 | 显式检查索引,或使用at() 方法 |
const 对象修改 | 实现const 版本,返回const 引用 |
链式调用歧义 | 使用代理类封装行/列数据 |
代理对象开销 | 避免虚函数,使用内联操作符 |
九、附录:操作符重载对比表
操作符 | 典型场景 | 返回值类型 | 参数类型 | 是否必须为成员函数 |
---|---|---|---|---|
operator[] | 元素访问 | T& 或const T& | KeyType | 必须 |
operator() | 仿函数(函数对象) | ReturnType | Args... | 可选 |
operator* | 解引用迭代器或智能指针 | T& 或const T& | 无 | 可选 |
operator-> | 智能指针或迭代器成员访问 | T* | 无 | 可选 |
相关文章:
【C++重载操作符与转换】下标操作符
目录 一、下标操作符重载基础 1.1 什么是下标操作符重载 1.2 默认行为与需求 1.3 基本语法 二、下标操作符的核心实现策略 2.1 基础实现:一维数组模拟 2.2 多维数组实现:矩阵类示例 三、下标操作符的高级用法 3.1 自定义索引类型:字…...
文章记单词 | 第62篇(六级)
一,单词释义 noon [nuːn] n. 中午,正午clothes [kləʊz] n. 衣服,衣物reward [rɪˈwɔːd] n. 报酬,奖赏;vt. 奖励,奖赏newly [ˈnjuːli] adv. 最近,新近;以新的方式premier [ˈ…...
《CUDA:解构GPU计算的暴力美学与工程哲学》
《CUDA:解构GPU计算的暴力美学与工程哲学》 CUDA 的诞生,宛如在 GPU 发展史上划下了一道分水岭。它不仅赋予了 GPU 走出图形处理的 “舒适区”,投身通用计算的 “新战场” 的能力,更是一场对计算资源分配与利用逻辑的彻底重构。在这场技术革命中,CUDA 以它犀利的架构设…...
Linux ACPI - ACPI系统描述表架构(2)
ACPI系统描述表架构 1.概要 ACPI defines a hardware register interface that an ACPI-compatible OS uses to control core power management features of a machine, as described in ACPI Hardware Specification ACPI also provides an abstract interface for controlli…...
实时在线状态
以下是一个完整的 OnlineUsers 类实现,包含线程安全的在线用户管理功能: import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors;/*** 在线用户管理器(线程安全)* 功能&#…...
《算法导论(第4版)》阅读笔记:p6-p6
《算法导论(第4版)》学习第 4 天,p6-p6 总结,总计 1 页。 一、技术总结 无。 二、英语总结(生词:1) 1. disposal (1)dispose: dis-(“aprt”) ponere(“to put, place”) vt. dispose literally means “to put apart(to separate sth…...
录播课制作技术指南
1.技术版本选择策略 优先采用长期支持版本作为课程开发基础,此类版本在企业级应用中普及度高且稳定性强。技术选型直接影响课程生命周期,稳定的底层框架可降低后续维护成本,避免因技术迭代导致教学内容快速过时。建议定期查看技术社区官方公告…...
【2025软考高级架构师】——知识脑图总结
摘要 本文是一份关于 2025 年软考高级架构师的知识脑图总结。整体涵盖系统工程与信息系统基础、软件工程、项目管理等众多板块,每个板块又细分诸多知识点,如系统工程部分提及系统工程方法、信息系统生命周期等内容,旨在为备考人员提供系统全…...
Allegro23.1新功能之如何设置高压爬电间距规则操作指导
Allegro23.1新功能之如何设置高压爬电间距规则操作指导 Allegro23.1升级到了23.1之后,新增了一个设置高压爬电间距的规则 如下图,不满足爬电间距要求,以DRC的形式报出来了...
**电商推荐系统设计思路**
互联网大厂Java面试实录:马小帅的生死时速 第一轮提问 面试官(严肃地):马小帅,请你先简单介绍一下你过往的项目经验,特别是你在项目中使用的技术栈。 马小帅(紧张地搓手)ÿ…...
BC19 反向输出一个四位数
题目:BC19 反向输出一个四位数 描述 将一个四位数,反向输出。(有前导零的时候保留前导零) 输入描述: 一行,输入一个整数n(1000 < n < 9999)。 输出描述: 针对每组…...
【前端】【面试】在 Vue-React 的迁移重构工作中,从状态管理角度来看,Vuex 迁移到 Redux 最大的挑战是什么,你是怎么应对的?
在从 Vue(Vuex)迁移到 React(Redux)时,状态管理无疑是重构中最具挑战性的部分之一。两者虽本质上都实现了全局状态集中式管理,但在思想、结构与实现方式上存在显著差异。 Vuex 到 Redux 状态管理迁移的挑战…...
ActiveMQ 与其他 MQ 的对比分析:Kafka/RocketMQ 的选型参考(一)
消息队列简介 在当今的分布式系统架构中,消息队列(Message Queue,MQ)扮演着举足轻重的角色,已然成为构建高可用、高性能系统不可或缺的组件。消息队列本质上是一种异步通信的中间件,它允许不同的应用程序或…...
OPENGLPG第九版学习 -视口变换、裁减、剪切与反馈
文章目录 5.1 观察视图5.1.1 视图模型—相机模型OpenGL的整个处理过程中所用到的坐标系统:视锥体视锥体的剪切 5.1.2 视图模型--正交视图模型 5.2 用户变换5.2.1 矩阵乘法的回顾5.2.2 齐次坐标5.2.3 线性变换与矩阵SRT透视投影正交投影 5.2.4 法线变换逐像素计算法向…...
大连理工大学选修课——图形学:第一章 图形学概述
第一章 图形学概述 计算机图形学及其研究内容 计算机图形学:用数学算法将二维或三维图形转化为计算机显示器的格栅形式的科学。 图形 计算机图形学的研究对象为图形广义来说,能在人的视觉系统形成视觉印象的客观对象都可称为图形。 既包括了各种几何…...
雅思听力--75个重点单词/词组
文章目录 1. in + 一段时间2. struggle with + doing sth.3. due to + n. / doing sth.4. all kinds of + n.5. supply6. get sb. down7. sth. be a hit8. ups and downs1. in + 一段时间 “in ten minutes”表示“10分钟内”,“in + 一段时间”表示“在一段时间之内”。 You…...
dubbo 参数校验-ValidationFilter
org.apache.dubbo.rpc.Filter 核心功能 拦截RPC调用流程 Filter是Dubbo框架中实现拦截逻辑的核心接口,作用于服务消费者和提供者的作业链路,支持在方法调用前后插入自定义逻辑。如参数校验、异常处理、日志记录等。扩展性机制 Dubbo通过SPI扩展机制动态…...
Fine Structure-Aware Sampling(AAAI 2024)论文笔记和启发
文章目录 本文解决的问题本文提出的方法以及启发 本文解决的问题 传统的基于Pifu的人体三维重建一般通过采样来进行学习。一般选择的采样方法是空间采样,具体是在surface的表面随机位移进行样本的生成。这里的采样是同时要在XYZ三个方向上进行。所以这导致了一个问…...
股票单因子的检验方法有哪些?
股票单因子的检验方法主要包括以下四类方法及相关指标: 一、统计指标检验 IC值分析法 定义:IC值(信息系数)衡量因子值与股票未来收益的相关性,包括两种计算方式: Normal IC:基于Pearson相关系数…...
Android第三次面试总结之activity和线程池篇(补充)
一、线程池高频面试题 1. 为什么 Android 中推荐使用线程池而非手动创建线程?(字节跳动 / 腾讯真题) 核心考点:线程池的优势、资源管理、性能优化答案要点: 复用线程:避免重复创建 / 销毁线程的开销&…...
【Trae+LucidCoder】三分钟编写专业Dashboard页面
AI辅助编码作为一项革命性技术,正在改变开发者的工作方式。本文将深入探讨如何利用Trae的AI Coding功能构建专业的Dashboard页面,同时向您推荐一个极具价值的工具——Lucids.top,它能够将页面截图转换为AI IDE的prompt,从而生成精…...
CUDA Toolkit 12.9 与 cuDNN 9.9.0 发布,带来全新特性与优化
NVIDIA 近日发布了 CUDA Toolkit 12.9,为开发者提供了一系列新功能和改进,旨在进一步提升 GPU 加速应用的性能和开发效率。CUDA Toolkit 是创建高性能 GPU 加速应用的关键开发环境,广泛应用于从嵌入式系统到超级计算机的各种计算平台。 新特…...
chrome 浏览器怎么不自动提示是否翻译网站
每次访问外国语网页都会弹出这个对话框,很是麻烦,每次都得手动关闭一下。 不让他弹出来方法: 设置》语言》首选语言》添加语言,搜索英语添加上 如果需要使用翻译,就点击三个点,然后选择翻译...
编程速递-RAD Studio 12.3 Athens四月补丁:关注软件性能的开发者,安装此补丁十分必要
2025年4月22日,Embarcadero发布了针对RAD Studio 12.3、Delphi 12.3以及CBuilder 12.3的四月补丁。此更新旨在提升这些产品的质量,特别关注于Delphi编译器、C 64位现代工具链、RAD Studio 64位IDE及其调试器、VCL库和其他RAD Studio特性。强烈建议所有使…...
Linux54 源码包的安装、修改环境变量解决 axel命令找不到;getfacl;测试
始终报错 . 补充链接 tinfo 库时报错软件包 ncurses-devel-5.9-14.20130511.el7_4.x86_64 已安装并且是最新版本 没有可用软件包 tinfo-devel。 无须任何处理 make LDLIBS“-lncurses"报错编译时报错make LDLIBS”-lncurses" ? /opt/rh/devtoolset-11/roo…...
驱动开发硬核特训 · Day 27(上篇):Linux 内核子系统的特性全解析
在过去数日的练习中,我们已经深入了解了字符设备驱动、设备模型与总线驱动模型、regulator 电源子系统、I2C 驱动模型、of_platform_populate 自动注册机制等关键模块。今天进入 Day 27,我们将正式梳理 Linux 内核子系统的核心特性与通用结构,…...
【学习笔记】深度学习:典型应用
作者选择了由 Ian Goodfellow、Yoshua Bengio 和 Aaron Courville 三位大佬撰写的《Deep Learning》(人工智能领域的经典教程,深度学习领域研究生必读教材),开始深度学习领域学习,深入全面的理解深度学习的理论知识。 之前的文章参考下面的链接…...
万字详解ADC药物Payload
抗体药物偶联物(ADC)是一种有前景的癌症治疗方式,能够选择性地将有效载荷(Payload)细胞毒性分子递送至肿瘤,降低副作用的严重程度。通常ADC由3个关键成分组成:抗体,连接子和有效载荷…...
算法笔记.求约数
代码实现: #include<iostream> using namespace std; #include<vector> void check(int x) {vector<int> v;for(int i 1;i< x/i;i){if(x%i 0) {cout << i<<" ";v.push_back(i);}}for(int i v.size()-1;i>0;i--){…...
Assetto Corsa 神力科莎 [DLC 解锁] [Steam] [Windows]
Assetto Corsa 神力科莎 [DLC 解锁] [Steam] [Windows] 需要有游戏正版基础本体,安装路径不能带有中文,或其它非常规拉丁字符; DLC 版本 至最新全部 DLC 后续可能无法及时更新文章,具体最新版本见下载文件说明 DLC 解锁列表&…...
启发式算法-遗传算法
遗传算法是一种受达尔文生物进化论和孟德尔遗传学说启发的启发式优化算法,通过模拟生物进化过程,在复杂搜索空间中寻找最优解或近似最优解。遗传算法的核心是将问题的解编码为染色体,每个染色体代表一个候选解,通过模拟生物进化中…...
生成式AI将重塑的未来工作
在人类文明的长河中,技术革命始终是推动社会进步的核心动力。从蒸汽机的轰鸣到互联网的浪潮,每一次技术跃迁都在重塑着人类的工作方式与生存形态。而今,生成式人工智能(Generative AI)的崛起,正以超越以往任何时代的速度与深度,叩响未来工作范式变革的大门。这场变革并非…...
【操作系统】吸烟者问题
问题描述 吸烟者问题是一个经典的同步问题,涉及三个抽烟者进程和一个供应者进程。每个抽烟者需要三种材料(烟草、纸和胶水)来卷烟,但每个抽烟者只有一种材料。供应者每次提供两种材料,拥有剩下那种材料的抽烟者可以卷烟…...
mysql-内置函数,复合查询和内外连接
一 日期函数 函数名称描述示例current_date()返回当前日期(格式:yyyy-mm-dd)select current_date(); → 2017-11-19current_time()返回当前时间(格式:hh:mm:ss)select current_time(); → 13:51:21current…...
软件架构之旅(6):浅析ATAM 在软件技术架构评估中的应用
文章目录 一、引言1.1 研究背景1.2 研究目的与意义 二、ATAM 的理论基础2.1 ATAM 的定义与核心思想2.2 ATAM 涉及的质量属性2.3 ATAM 与其他架构评估方法的关系 三、ATAM 的评估流程3.1 准备阶段3.2 场景和需求收集阶段3.3 架构描述阶段3.4 评估阶段3.5 结果报告阶段 四、ATAM …...
【SQL触发器、事务、锁的概念和应用】
【SQL触发器、事务、锁的概念和应用】 1.触发器 (一)触发器概述 1.触发器的定义 触发器(Trigger)是一种特殊的存储过程,它与表紧密相连,可以是表定义的一部分。当预定义的事件(如用户修改指定表或者视图中的数据)发生时,触发器会自动执行。 触发器基于一个表创建,…...
5.4学习记录
今天的目标是复习刷过往的提高课的DP题目:重点是数位DP,状态压缩DP,然后去做一些新的DP题目 然后明天的任务就是把DP的题目汇总,复习一些疑难的问题 方格取数: 题目背景 NOIP 2000 提高组 T4 题目描述 设有 NN 的方…...
Hadoop 1.x设计理念解析
一、背景 有人可能会好奇,为什么要学一个二十年前的东西呢? Hadoop 1.x虽然是二十年前的,但hadoop生态系统中的一些组件如今还在广泛使用,如hdfs和yarn,当今流行spark和flink都依赖这些组件 通过学习它们的历史设计…...
缓存与数据库的高效读写流程解析
目录 前言1 读取数据的流程1.1 检查缓存是否命中1.2 从数据库读取数据1.3 更新缓存1.4 返回数据 2 写入数据的流程2.1 更新数据库2.2 更新或删除缓存2.3 缓存失效 3 缓存与数据库的一致性问题3.1 写穿(Write-through)策略3.2 写回(Write-back…...
Linux中的粘滞位和开发工具和文本编辑器vim
1.粘滞位的使用的背景: 当几个普通用户需要文件共享操作时,他们就需要在同一个目录下进行操作,那么就诞生一个问题,由谁来创建这个公共的目录文件?假设是由其中的一个普通用户来创建一个默认的目录文件,这就…...
冯诺依曼结构与哈佛架构深度解析
一、冯诺依曼结构(Von Neumann Architecture) 1.1 核心定义 由约翰冯诺依曼提出,程序指令与数据共享同一存储空间和总线,通过分时复用实现存取。 存储器总带宽 指令带宽 数据带宽 即:B_mem f_clk W_data f_…...
如何提升个人情商?
引言 提升个人情商(EQ)是一个持续的自我修炼过程,涉及自我认知、情绪管理、人际沟通等多个方面。以下是一些具体且可实践的方法,帮助你逐步提升情商: 一、提升自我觉察能力 1. 记录情绪日记 每天回顾自己的情绪…...
JSON Web Token 默认密钥 身份验证安全性分析 dubbo-admin JWT硬编码身份验证绕过
引言 在web开发中,对于用户认证的问题,有很多的解决方案。其中传统的认证方式:基于session的用户身份验证便是可采用的一种。 基于session的用户身份验证验证过程: 用户在用进行验证之后,服务器保存用户信息返回sess…...
K230的ISP(图像信号处理器)通常支持多通道输出,常见配置为3个独立通道
也就是一个摄像头可以拍摄三种配置的图片,这样就可以调用三种: img_try sensor.snapshot(chnCAM_CHN_ID_0) img_try2 sensor.snapshot(chnCAM_CHN_ID_1) img_try3 sensor.snapshot(chnCAM_CHN_ID_2) 这样可以一图多用 eg: # 初始化并配…...
工程师 - 小米汽车尾部主动扩散器
关于小米SU7 Ultra的主动尾部扩散器,其设计初衷是为了平衡日常驾驶的节能需求与运动驾驶的操控性能。这一装置位于车辆尾部下方,具备自动调节功能,能够根据车速在0和32之间切换,同时也支持手动调整。 32度打开状态: 0度…...
Linux watch 命令使用详解
简介 watch 命令会以固定间隔(默认每 2 秒)重复运行给定命令,并在终端上显示其输出。它非常适合监控不断变化的输出,例如磁盘使用情况、内存使用情况、文件更改、服务状态等。 基础语法 watch [options] command常用选项 -n, -…...
RabbitMQ-基础
RabbitMQ-基础 文章目录 RabbitMQ-基础1.同步调用2.异步调用3.技术选型4.安装RabbitMQ(官方网址)https://www.rabbitmq.com/5.快速入门5.1收发消息5.1.1交换机5.1.2队列5.1.3绑定关系5.1.4发送消息 5.2数据隔离5.2.1用户管理5.2.2virtual host 6.Java客户端操作RabbitMQ6.1快速…...
第九周作业
安全专题笔记 1、文件上传 (1) 服务端白名单绕过 %00截断绕过要求虚拟机中搭建实验环境,分别实现GET、POST方法的绕过 前提条件: 1 php的版本需要在5.4以下 2 magic_quotes_gpc需要设置为off 启动phpstudy,前往php-ini将magic_quotes_gpc…...
AtCoder Beginner Contest 404 C-G(无F)题解
C. Cycle Graph? 题意 给你一个 N N N 个顶点 M M M 条边的简单(无重边、自环)无向图,第 i i i 条边连接节点 A i A_i Ai 和 B i B_i Bi,判断这个图是不是一个环。 思路 首先一个图是环,要满足点数等于边…...
Python----机器学习(模型评估:准确率、损失函数值、精确度、召回率、F1分数、混淆矩阵、ROC曲线和AUC值、Top-k精度)
一、模型评估 1. 准确率(Accuracy):这是最基本的评估指标之一,表示模型在测试集上正确 分类样本的比例。对于分类任务而言,准确率是衡量模型性能的直观标准。 2. 损失函数值(Loss)࿱…...