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

【面试】封装、继承、多态的具象示例 模板编程的理解与应用场景 链表适用的场景

文章目录

  • C++面试:封装、继承、多态的具象示例
    • 1. 封装 (Encapsulation)
    • 2. 继承 (Inheritance)
    • 3. 多态 (Polymorphism)
    • 综合示例:封装、继承、多态
  • C++模板编程的理解与应用场景
    • 我对模板编程的理解
    • C++中最常用的模板编程场景
      • 1. STL (标准模板库)
      • 2. 通用容器实现
      • 3. 通用算法实现
      • 4. 类型安全的接口
      • 5. 策略模式实现
      • 6. 元编程和编译期计算
      • 7. CRTP (奇异递归模板模式)
      • 8. 类型萃取(Type Traits)
    • 模板编程的优势
    • 总结
  • 链表适用的场景
    • 1. 频繁的插入和删除操作
    • 2. 不确定数据量的动态存储
    • 3. 不需要随机访问的场景
    • 4. 内存碎片化严重的环境
    • 5. 需要高效合并/拆分的场景
    • 6. 实现高级数据结构
    • 链表 vs 数组的对比
    • 实际案例
    • 何时选择链表
      • 1. **Linux 管理进程队列**
      • 2. **内存页管理(如 Buddy System 的链表)**
      • 3. **堆内存管理(如 malloc 的 free list)**
      • 4. **文件系统管理文件信息(如 inode 链表)**
      • 5. **MySQL 索引的叶子节点链表(B+Tree 特性)**
      • **链表的优势总结**
      • **为什么不选数组或其他结构?**

C++面试:封装、继承、多态的具象示例

1. 封装 (Encapsulation)

封装是将数据和操作数据的方法绑定在一起,并对外隐藏实现细节的过程。

示例:

class BankAccount {
private:  // 数据隐藏std::string accountNumber;double balance;public:  // 公开接口BankAccount(const std::string& accNum, double initialBalance) : accountNumber(accNum), balance(initialBalance) {}void deposit(double amount) {if (amount > 0) {balance += amount;}}bool withdraw(double amount) {if (amount > 0 && balance >= amount) {balance -= amount;return true;}return false;}double getBalance() const {return balance;}
};int main() {BankAccount account("123456789", 1000.0);account.deposit(500.0);account.withdraw(200.0);std::cout << "Current balance: " << account.getBalance() << std::endl;// account.balance = 1000000.0; // 错误!balance是私有的
}

封装的好处:

  • 保护数据不被外部随意修改
  • 可以修改内部实现而不影响外部代码
  • 提供清晰的接口供外部使用

2. 继承 (Inheritance)

继承允许我们基于已有的类创建新类,新类继承原有类的特性并可以添加新特性。

示例:

// 基类
class Animal {
protected:std::string name;int age;public:Animal(const std::string& name, int age) : name(name), age(age) {}void eat() {std::cout << name << " is eating." << std::endl;}void sleep() {std::cout << name << " is sleeping." << std::endl;}
};// 派生类
class Dog : public Animal {
private:std::string breed;public:Dog(const std::string& name, int age, const std::string& breed): Animal(name, age), breed(breed) {}void bark() {std::cout << name << " (a " << breed << ") is barking: Woof! Woof!" << std::endl;}void fetch() {std::cout << name << " is fetching the ball." << std::endl;}
};int main() {Dog myDog("Buddy", 3, "Golden Retriever");myDog.eat();    // 继承自AnimalmyDog.sleep();  // 继承自AnimalmyDog.bark();   // Dog特有的方法myDog.fetch();  // Dog特有的方法
}

继承的好处:

  • 代码复用:派生类可以重用基类的代码
  • 层次化组织:可以创建类的层次结构
  • 可扩展性:可以在不修改基类的情况下添加新功能

3. 多态 (Polymorphism)

多态允许我们使用统一的接口处理不同类型的对象。

示例:

class Shape {
public:virtual void draw() const = 0;  // 纯虚函数virtual ~Shape() {}             // 虚析构函数
};class Circle : public Shape {
private:double radius;public:Circle(double r) : radius(r) {}void draw() const override {std::cout << "Drawing a circle with radius " << radius << std::endl;}
};class Square : public Shape {
private:double side;public:Square(double s) : side(s) {}void draw() const override {std::cout << "Drawing a square with side " << side << std::endl;}
};void drawAllShapes(const std::vector<Shape*>& shapes) {for (const auto& shape : shapes) {shape->draw();  // 多态调用}
}int main() {std::vector<Shape*> shapes;shapes.push_back(new Circle(5.0));shapes.push_back(new Square(4.0));shapes.push_back(new Circle(3.0));drawAllShapes(shapes);// 清理内存for (auto shape : shapes) {delete shape;}
}

多态的好处:

  • 接口统一:可以用相同的方式处理不同的对象
  • 可扩展性:可以添加新类而不需要修改现有代码
  • 灵活性:运行时决定调用哪个方法

综合示例:封装、继承、多态

#include <iostream>
#include <vector>
#include <memory>// 封装
class Employee {
private:std::string name;int id;double salary;public:Employee(const std::string& n, int i, double s) : name(n), id(i), salary(s) {}virtual ~Employee() {}virtual void work() const {std::cout << name << " (ID: " << id << ") is working." << std::endl;}virtual double calculateBonus() const {return salary * 0.1;  // 默认10%的奖金}std::string getName() const { return name; }int getId() const { return id; }double getSalary() const { return salary; }
};// 继承
class Manager : public Employee {
private:std::string department;public:Manager(const std::string& n, int i, double s, const std::string& d): Employee(n, i, s), department(d) {}void work() const override {std::cout << getName() << " (Manager of " << department << ") is managing the team." << std::endl;}double calculateBonus() const override {return getSalary() * 0.2;  // 经理有20%的奖金}
};class Developer : public Employee {
private:std::string programmingLanguage;public:Developer(const std::string& n, int i, double s, const std::string& lang): Employee(n, i, s), programmingLanguage(lang) {}void work() const override {std::cout << getName() << " is coding in " << programmingLanguage << "." << std::endl;}void debug() const {std::cout << getName() << " is debugging " << programmingLanguage << " code." << std::endl;}
};// 多态
void processEmployees(const std::vector<std::unique_ptr<Employee>>& employees) {for (const auto& emp : employees) {emp->work();  // 多态调用std::cout << emp->getName() << "'s bonus: $" << emp->calculateBonus() << std::endl;// 尝试向下转型if (auto dev = dynamic_cast<Developer*>(emp.get())) {dev->debug();}}
}int main() {std::vector<std::unique_ptr<Employee>> employees;employees.emplace_back(std::make_unique<Manager>("Alice", 101, 80000, "Engineering"));employees.emplace_back(std::make_unique<Developer>("Bob", 102, 70000, "C++"));employees.emplace_back(std::make_unique<Developer>("Charlie", 103, 75000, "Python"));processEmployees(employees);return 0;
}

这个综合示例展示了:

  1. 封装:Employee类隐藏了内部数据,提供公共接口
  2. 继承:Manager和Developer继承自Employee,扩展了功能
  3. 多态:processEmployees函数可以处理不同类型的Employee对象

C++模板编程的理解与应用场景

我对模板编程的理解

模板编程(Template Programming)是C++中一种强大的泛型编程技术,它允许我们编写与数据类型无关的代码。通过模板,我们可以创建能够处理多种数据类型的函数或类,而无需为每种类型重复编写代码。

模板编程的核心思想是**“参数化类型”**,即在编写代码时不指定具体的数据类型,而是使用类型参数,在实际使用时再指定具体类型。

C++中最常用的模板编程场景

1. STL (标准模板库)

STL是C++模板编程最经典、最广泛的应用场景:

#include <vector>
#include <list>
#include <map>
#include <algorithm>// 这些容器和算法都是模板
std::vector<int> intVec;          // 整数向量
std::list<std::string> strList;   // 字符串链表
std::map<int, double> idMap;      // 整数到浮点数的映射// 模板算法
std::sort(intVec.begin(), intVec.end());
auto it = std::find(strList.begin(), strList.end(), "template");

2. 通用容器实现

当需要实现可以存储任意类型数据的容器时:

template <typename T>
class MyArray {
private:T* data;size_t size;
public:MyArray(size_t s) : size(s), data(new T[s]) {}~MyArray() { delete[] data; }T& operator[](size_t index) {return data[index];}// ... 其他成员函数
};// 使用
MyArray<int> intArray(10);
MyArray<std::string> strArray(5);

3. 通用算法实现

编写适用于多种数据类型的算法:

template <typename T>
T max(T a, T b) {return (a > b) ? a : b;
}// 使用
int m1 = max(3, 5);                  // int
double m2 = max(3.14, 2.71);          // double
std::string m3 = max("apple", "zoo"); // std::string

4. 类型安全的接口

创建类型安全且灵活的接口:

template <typename T>
class Singleton {
private:static T* instance;Singleton() = default;
public:static T& getInstance() {if (!instance) {instance = new T();}return *instance;}
};template <typename T>
T* Singleton<T>::instance = nullptr;// 使用
class Logger : public Singleton<Logger> {friend class Singleton<Logger>;
private:Logger() = default;
public:void log(const std::string& message) {// 实现日志功能}
};Logger::getInstance().log("Template example");

5. 策略模式实现

通过模板实现编译期策略选择:

// 排序策略
struct BubbleSort {template <typename Iter>static void sort(Iter begin, Iter end) {// 冒泡排序实现}
};struct QuickSort {template <typename Iter>static void sort(Iter begin, Iter end) {// 快速排序实现}
};// 排序器模板
template <typename SortStrategy>
class Sorter {
public:template <typename Iter>void operator()(Iter begin, Iter end) {SortStrategy::sort(begin, end);}
};// 使用
std::vector<int> data = {5, 2, 9, 1, 5};
Sorter<QuickSort>()(data.begin(), data.end());

6. 元编程和编译期计算

利用模板进行编译期计算和类型操作:

// 编译期阶乘计算
template <unsigned n>
struct Factorial {static const unsigned value = n * Factorial<n-1>::value;
};template <>
struct Factorial<0> {static const unsigned value = 1;
};// 使用
constexpr unsigned fact5 = Factorial<5>::value;  // 120

7. CRTP (奇异递归模板模式)

用于静态多态和代码复用:

template <typename Derived>
class Base {
public:void interface() {static_cast<Derived*>(this)->implementation();}
};class Derived : public Base<Derived> {
public:void implementation() {std::cout << "Derived implementation" << std::endl;}
};// 使用
Derived d;
d.interface();  // 输出 "Derived implementation"

8. 类型萃取(Type Traits)

在模板中检查和操作类型信息:

#include <type_traits>template <typename T>
void process(T value) {if constexpr (std::is_integral_v<T>) {std::cout << "Processing integer: " << value << std::endl;} else if constexpr (std::is_floating_point_v<T>) {std::cout << "Processing float: " << value << std::endl;} else {std::cout << "Processing unknown type" << std::endl;}
}// 使用
process(42);        // 处理整数
process(3.14);      // 处理浮点数
process("hello");   // 处理未知类型

模板编程的优势

  1. 代码复用:编写一次,适用于多种类型
  2. 类型安全:编译时类型检查,避免运行时错误
  3. 性能:没有运行时开销,所有工作在编译期完成
  4. 灵活性:可以创建高度通用的库和组件
  5. 可扩展性:易于添加对新类型的支持

总结

C++中模板编程最常见的应用场景包括STL容器和算法、通用数据结构和算法实现、类型安全接口设计、策略模式实现、编译期计算、静态多态以及类型萃取等。模板编程是C++强大表达能力的核心之一,也是现代C++编程不可或缺的部分。

链表适用的场景

链表是一种基础的数据结构,在以下场景中特别适用:

  1. 频繁的中间插入和删除操作
  2. linux管理进程各种队列,内存页,堆内存链表,文件信息链表,mysql的索引叶子结点链表
  3. 实现特定的数据结构:lru,哈希表链地址法,图邻接表,跳表,

1. 频繁的插入和删除操作

当需要频繁在数据集合中间进行插入或删除操作时,链表比数组更有优势。

典型场景

  • 实现撤销(Undo)功能(每次操作都插入链表头部)
  • 浏览器历史记录(前进/后退)
  • 进程调度队列(经常需要添加和移除进程)
// 例如实现撤销功能
struct Command {virtual void execute() = 0;virtual void undo() = 0;
};std::list<std::shared_ptr<Command>> undoStack;// 执行新命令时
auto cmd = std::make_shared<SomeCommand>();
cmd->execute();
undoStack.push_front(cmd);  // O(1)时间复杂度// 撤销时
if (!undoStack.empty()) {undoStack.front()->undo();undoStack.pop_front();  // O(1)时间复杂度
}

2. 不确定数据量的动态存储

当数据量未知或变化很大时,链表可以动态增长而不需要预先分配空间。

典型场景

  • 读取未知长度的数据流
  • 内存受限环境中的动态分配
  • 实现其他数据结构(如栈、队列、图等)
// 读取未知长度的输入
std::list<std::string> inputLines;
std::string line;while (std::getline(std::cin, line)) {inputLines.push_back(line);
}

3. 不需要随机访问的场景

当主要操作是顺序访问而非随机访问时,链表很合适。

典型场景

  • 音乐播放器的播放列表
  • 文件系统的目录结构
  • 多道程序环境下的I/O缓冲区
// 音乐播放列表
class Song {std::string title;std::string artist;// ...
};std::list<Song> playlist;// 顺序播放
for (const auto& song : playlist) {playSong(song);
}

4. 内存碎片化严重的环境

在内存受限或碎片化严重的环境中,链表比数组更有优势,因为它不需要连续内存空间。

典型场景

  • 嵌入式系统
  • 操作系统内核数据结构
  • 内存分配器实现

5. 需要高效合并/拆分的场景

当需要频繁合并两个集合或拆分集合时,链表可以在O(1)时间内完成。

典型场景

  • 归并排序的实现
  • 数据库中的多表连接操作
  • 消息队列的合并
// 合并两个链表
std::list<int> list1 = {1, 2, 3};
std::list<int> list2 = {4, 5, 6};list1.splice(list1.end(), list2);  // O(1)操作
// list1现在包含1,2,3,4,5,6

6. 实现高级数据结构

许多高级数据结构基于链表实现:

典型场景

  • 哈希表的链地址法解决冲突
  • 图的邻接表表示
  • 跳表的基础结构
  • 二叉树的某些表示方法
// 哈希表的链地址法实现
template <typename K, typename V>
class HashMap {
private:std::vector<std::list<std::pair<K, V>>> buckets;// ...
public:void insert(const K& key, const V& value) {size_t index = hash(key) % buckets.size();for (auto& pair : buckets[index]) {if (pair.first == key) {pair.second = value;return;}}buckets[index].emplace_back(key, value);}// ...
};

链表 vs 数组的对比

场景/操作链表优势数组优势
频繁插入删除✅ O(1)❌ O(n)
随机访问❌ O(n)✅ O(1)
内存使用动态分配局部性好
缓存友好度❌ 差✅ 好
内存碎片化环境✅ 适应❌ 不适应
预知大小、少变动的数据

实际案例

  1. Linux内核:使用链表管理进程、内存页等
  2. Redis:使用双向链表实现List数据类型
  3. Nginx:使用链表管理连接、请求等
  4. 游戏开发:场景中的动态对象管理
  5. 区块链:区块链本身就是一种链表结构

何时选择链表

选择链表而非数组的主要考虑因素是:

  • 插入/删除频率高于随机访问频率
  • 数据量变化大或不可预测
  • 内存连续性无法保证
  • 需要频繁合并/拆分数据结构
  • 实现特定的算法需求(如LRU缓存)

在C++中,std::list(双向链表)和std::forward_list(单向链表)是标准库提供的链表实现,应根据具体需求选择合适的类型。
这些场景选择链表(尤其是双向链表)作为数据结构,主要基于链表的以下特性与场景需求的匹配:


1. Linux 管理进程队列

  • 动态增删频繁:进程的创建、终止、调度等操作需要频繁插入/删除节点。链表在 O ( 1 ) O(1) O(1) 时间内即可完成这些操作,而数组需要移动元素。
  • 不确定性数量:进程数量动态变化,链表无需预分配固定空间,避免内存浪费或扩容开销。
  • 双向遍历需求:Linux 使用双向链表(如 struct list_head),便于从任意节点向前或向后遍历(例如查找相邻进程或优先级调整)。

2. 内存页管理(如 Buddy System 的链表)

  • 碎片化处理:内存页需按不同大小(如 4KB、8KB)组织成多个链表。链表可灵活管理非连续的空闲页块。
  • 快速分配/释放:分配内存时从对应大小的链表中移除节点;释放时快速插入,均无需移动其他元素。
  • 合并操作:双向链表便于合并相邻空闲页块(通过前后指针检查相邻页状态)。

3. 堆内存管理(如 malloc 的 free list)

  • 变长内存块:堆内存块大小不一,链表可串联不同大小的空闲块,通过指针连接,无需连续内存。
  • 高效合并:释放内存时,双向链表能快速检查前后块是否空闲,合并减少碎片。

4. 文件系统管理文件信息(如 inode 链表)

  • 动态文件数量:文件创建/删除导致 inode 数量变化,链表支持动态扩展。
  • 快速查找与遍历:结合哈希表或树,链表用于维护同一哈希桶或目录下的文件序列,便于线性访问。

5. MySQL 索引的叶子节点链表(B+Tree 特性)

  • 范围查询优化:B+Tree 的叶子节点通过链表串联,使范围查询(如 WHERE id BETWEEN 10 AND 100)只需定位起始节点后顺链遍历,无需回溯父节点。
  • 磁盘 I/O 优化:链表结构适合磁盘预读(顺序访问性能接近数组),而插入/删除节点仅需修改相邻节点的指针,避免大量数据移动。

链表的优势总结

  • 插入/删除高效:尤其适合频繁动态修改的场景。
  • 无预分配限制:适应数据规模不确定的情况。
  • 双向链表支持逆向操作:如 Linux 进程回滚、内存块合并等。
  • 天然支持非连续存储:适合内存碎片化或磁盘分散存储的场景。

为什么不选数组或其他结构?

  • 数组:插入/删除需移动元素,扩容成本高;静态大小不灵活。
  • 哈希表:无法高效支持范围查询(如 MySQL 需要链表辅助)。
  • 普通树结构:维护复杂,且范围查询不如链表直接。

在这些场景中,链表(尤其是双向链表)在动态性、操作效率和空间利用率上达到了最佳平衡。

相关文章:

【面试】封装、继承、多态的具象示例 模板编程的理解与应用场景 链表适用的场景

文章目录 C面试&#xff1a;封装、继承、多态的具象示例1. 封装 (Encapsulation)2. 继承 (Inheritance)3. 多态 (Polymorphism)综合示例&#xff1a;封装、继承、多态 C模板编程的理解与应用场景我对模板编程的理解C中最常用的模板编程场景1. STL (标准模板库)2. 通用容器实现3…...

机器学习02——概要

一、简介 机器学习是一门在没有明确编程的情况下让计算机学习的科学。 监督学习是有目标的&#xff0c;输入数据对应明确的输出&#xff1b;无监督学习则是“探索”型的&#xff0c;模型的目标是从数据中发现潜在的模式或结构&#xff0c;而不需要预先知道标签。 二、机器学…...

常用的网络安全靶场、工具箱

转载&#xff1a;https://blog.csdn.net/zjzqxzhj/article/details/137945444 打CTF很好玩。可以试一下 1.CTF在线工具 1、CTF在线工具箱&#xff1a;http://ctf.ssleye.com/ 包含CTF比赛中常用的编码、加解密、算法。 2、CTF加解密工具箱&#xff1a;http://www.atoolbox.…...

excel中的VBA指令示例(一)

示例注释&#xff1a; Sub 宏1() sub是宏开头&#xff0c;宏1是宏的名称&#xff0c;自定义&#xff0c;在按钮中可指定用某个宏 后面是注释 Sheets("装配材料").Select ‘选择表 装配材料 Ce…...

神经网络 | 基于脉冲耦合神经网络PCNN图像特征提取与匹配(附matlab代码)

内容未发表论文基于脉冲耦合神经网络(PCNN)的图像特征提取与匹配研究 摘要 本文提出一种基于脉冲耦合神经网络(Pulse-Coupled Neural Network, PCNN)的图像特征提取与匹配方法。通过模拟生物视觉皮层神经元的脉冲同步发放特性,PCNN能够有效捕捉图像纹理与边缘特征。实验表…...

Linux 内核中的 TCP 早期多路分解机制解析

一、引言 在现代高性能网络环境中,Linux 内核需要快速处理大量的 TCP 数据包,同时保持低延迟和高吞吐量。为了实现这一目标,Linux 内核引入了 早期多路分解(Early Demultiplexing) 机制。这种机制允许内核在数据包进入传输层之前,快速找到对应的套接字(socket)并关联数…...

Yalmip工具箱(3)——错误类型

在yalmip中&#xff0c;不可避免地我们会遇到求解出问题的情况&#xff0c;理解和处理错误信息是至关重要的环节。在这里我们查看yalmip的所有错误类型&#xff08;详细见 yalmiperror.m 函数&#xff09; 函数概述 yalmiperror函数的主要作用是根据YALMIP产生的错误代码&…...

【KWDB 创作者计划】_KWDB:开源引领数据库创新变革

在数字化浪潮汹涌澎湃的当下&#xff0c;数据已然成为驱动各行各业发展的核心要素。数据库作为数据管理的关键工具&#xff0c;其性能、功能以及开放性&#xff0c;对企业和社会的数字化进程起着举足轻重的作用。KWDB&#xff0c;作为数据库领域的一颗璀璨新星&#xff0c;正以…...

HarmonyOS学习 实验八:显式动画与属性动画的实现

鸿蒙系统动画开发实战&#xff1a;显式动画与属性动画的探索 引言 在鸿蒙系统的开发过程中&#xff0c;动画效果是提升用户体验的重要一环。通过巧妙运用动画&#xff0c;可以使应用界面更加生动、交互更加流畅。鸿蒙系统提供了丰富的动画开发能力&#xff0c;其中显式动画和…...

高校智慧能源系统解决方案:推动绿色校园建设的智能化实践

高校智慧能源系统解决方案&#xff1a;推动绿色校园建设的智能化实践 一、建设背景&#xff1a;政策驱动与绿色发展需求 为响应国家“碳达峰、碳中和”战略目标&#xff0c;教育部印发《绿色低碳发展国民教育体系建设实施方案》&#xff0c;明确提出需完善校园能源管理体系&a…...

win日志

以第一个为例子 打开后&#xff0c;右上角&#xff08;将所有事件另存为xx)然后一般写今天的日期&#xff0c;进行备份 然后选择下语言即可 日志备份时间的选择&#xff08;根据实际情况选择日志时间&#xff09; 点击右侧事件属性&#xff0c;然后xml视图即可 常见的安全事件…...

嵌入式开发之51单片机入门(一)与LED灯的故事

得而不惜就该死。 --小泽 继续傻冒开始&#xff0c;这次的傻冒之旅是关于嵌入式的51单片机开发&#xff0c;这个系列只讲程序开发逻辑&#xff0c;如需初始环境安装配置&#xff0c;建议移步B站江协科技大佬&#xff0c;本系列也是对大佬所讲内容的复刻&#xff0c;同时添加一…...

TCP 与 UDP

TCP 与 UDP 的区别&#xff08;重要&#xff09; 是否面向连接&#xff1a;UDP 在传送数据之前不需要先建立连接。而 TCP 提供面向连接的服务&#xff0c;在传送数据之前必须先建立连接&#xff0c;数据传送结束后要释放连接。是否是可靠传输&#xff1a;远地主机在收到 UDP 报…...

Linux:进程地址空间

在讲述本篇文章之前&#xff0c;我们先来看一段代码。 从上图输出可以看到&#xff0c;我们的子进程继承了父进程的全局变量val&#xff0c;当子进程中的val产生了修改时&#xff0c;父进程的val值并没有变化&#xff0c;但父子进程在打印val的地址时&#xff0c;会发现val的地…...

【Linux】Linux 操作系统 - 03 ,初步指令结尾 + shell 理解

文章目录 前言一、打包和压缩二、有关体系结构 (考)面试题 三、重要的热键四、shell 命令及运行原理初步理解五、本节命令总结总结 前言 本篇文章 , 笔者记录的笔记内容包含 : 基础指令 、重要热键 、shell 初步理解 、权限用户的部分问题 。 内容皆是重要知识点 , 需要认真理…...

华为数通不同级别的认证路径和要求是什么?

一、认证路径 HCIA&#xff1a;无需前置认证&#xff0c;通过一门考试&#xff08;代码H12-811&#xff09;即可拿证。 HCIP&#xff1a;建议先通过HCIA-Datacom&#xff0c;再选择子方向&#xff08;如高级路由、安全&#xff09;。 HCIE&#xff1a;最好有hcia/hcip的基础…...

电子电气架构 --- 新能源汽车电子电气系统功能需求

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 周末洗了一个澡,换了一身衣服,出了门却不知道去哪儿,不知道去找谁,漫无目的走着,大概这就是成年人最深的孤独吧! 旧人不知我近况,新人不知我过…...

《从单体到分布式:一个订单系统的架构升级》

1. 问题爆发&#xff1a;单体架构的极限​​ 原来的订单系统长这样&#xff1a; ​​技术栈​​&#xff1a;SpringBoot MyBatis MySQL&#xff08;主从&#xff09;​​部署​​&#xff1a;单机跑所有模块&#xff08;订单、支付、库存&#xff09;​​痛点​​&#xff…...

琴键上的强化学习:让机器人在真实世界里弹钢琴!

在科技飞速发展的今天&#xff0c;机器人的能力边界不断拓展。想象一下&#xff0c;机器人坐在钢琴前&#xff0c;行云流水地弹奏出美妙乐章&#xff0c;这不再是科幻电影里的场景。近日&#xff0c;科研人员在机器人弹钢琴领域取得了突破性进展&#xff0c;让我们一同走进这个…...

【Unity网络编程知识】C#的 Http相关类学习

1、搭建HTTP服务器 使用别人做好的HTTP服务器软件&#xff0c;一般作为资源服务器时使用该方式&#xff08;学习阶段建议使用&#xff09;自己编写HTTP服务器应用程序&#xff0c;一般作为Web服务器或者短连接游戏服务器时使用该方式&#xff08;工作后由后端程序员来做&#…...

【算法学习】链表篇:链表的常用技巧和操作总结

算法学习&#xff1a; https://blog.csdn.net/2301_80220607/category_12922080.html?spm1001.2014.3001.5482 前言&#xff1a; 在各种数据结构中&#xff0c;链表是最常用的几个之一&#xff0c;熟练使用链表和链表相关的算法&#xff0c;可以让我们在处理很多问题上都更加…...

【前端笔记】CSS预处理语言 LESS

官网&#xff1a; Less 快速入门 | Less.js 中文文档 - Less 中文网 LESS很多地方可以比CSS简写很多 安装 npm install -g less 核心优势&#xff1a;变量、嵌套、混合、运算功能让CSS更容易维护&#xff0c;比原生CSS更加简洁高效 1. 变量&#xff08;Variables&#xff09…...

Oracle 查看后台正在执行的 SQL 语句

在 Oracle 数据库中&#xff0c;要查看后台正在执行的 SQL 语句&#xff0c;可以通过查询动态性能视图&#xff08;Dynamic Performance Views&#xff09;或使用监控工具来实现。 1. 查询动态性能视图 (1) 查看当前活跃会话及其执行的 SQL 使用 v$session 和 v$sql 视图关联…...

强化学习原理二 BasicConcepts

状态&#xff0c;State 状态空间&#xff0c;State Space 行动&#xff0c;Action状态转换&#xff0c;state transition策略&#xff0c;Policy 用数组或者矩阵表示这样一个策略 奖励&#xff0c;Reward 不确定的话&#xff0c;表格就不适用了。这个时候就要用数学来表示&…...

【机密计算顶会解读】13:CAGE:通过 GPU 扩展补充 Arm CCA

导读&#xff1a;本文介绍GAGE&#xff0c;利用Arm CCA中的现有硬件安全特性来确保敏感数据的安全性&#xff0c;支持GPU加速的机密计算&#xff0c;在实际平台上的平均性能开销仅为 2.45%&#xff0c;在保持高性能的同时&#xff0c;提供了良好的数据安全保护&#xff0c;且其…...

Android 使用kill -9(SIGKILL信号)强制终止Native进程时,是否会生成tombstone文件

在Android系统中&#xff0c;​使用kill -9&#xff08;SIGKILL信号&#xff09;强制终止Native进程时&#xff0c;不会生成tombstone文件。以下是具体原因和背景分析&#xff1a; 1. ​SIGKILL信号的特性 ​SIGKILL&#xff08;信号9&#xff09;​ 是Linux系统中最高优先级…...

WPS JS宏编程教程(从基础到进阶)-- 第六部分:JS集合与映射在 WPS 的应用

目录 第6章 JS集合与映射在 WPS 的应用6-1 集合的创建(实例:唯一值提取)示例代码详细解析Excel 环境模拟说明6-2 集合的不重复特性应用(案例:提取唯一值记录)示例代码详细解析案例说明6-3 集合成员添加与删除示例代码代码解析直观示意(Excel 模拟表格)6-4 集合成员添加…...

1.VTK 使用CMakeLists

文章目录 1.创建目录2.配置VTK编译环境3.创建main.cpp4.CMake编译 1.创建目录 选择一个空文件夹创建CMakeLists.txt 文件&#xff0c;注意CMakeLists不要写错 2.配置VTK编译环境 cmake_minimum_required(VERSION 3.5) # 最低要求 CMake 3.5&#xff0c;避免兼容性问题 proje…...

PDFtk

如果下载的pdf文件有秘钥的话&#xff0c;使用下面linux命令去掉秘钥&#xff1a; pdftk 纳税记录.pdf input_pw 261021 output 纳税记录_output.pdf将多个单页pdf合并为一个pdf的linux命令: pdftk 自然人电子税务局1.pdf 自然人电子税务局2.pdf 自然人电子税务局3.pdf 自然人…...

整理我的macos的复杂混乱的python环境

一、彻底清理现有环境&#xff08;为全新配置铺路&#xff09; 1. 核级清理&#xff08;⚠️ 先备份重要数据&#xff09; bash复制# 删除所有第三方Python安装 sudo rm -rf /Library/Frameworks/Python.framework/ rm -rf ~/Library/Python/ rm -rf ~/.local/bin/python* rm…...

Vue Router(1)

RouterLink 和 RouterView RouterLink 是一个导航组件&#xff0c;用于在不重新加载页面的情况下切换视图。 RouterView 是一个视图渲染容器组件&#xff0c;用于显示与当前 URL 匹配的组件。 <template><p><strong>Current route path:</strong> {{…...

AI时代如何让命令行工具快速智能化?

引言 作为开发者&#xff0c;我们经常会开发各种命令行工具来提升工作效率。 在AI时代我们又多了一个选择&#xff1a;通过AI生成代码&#xff0c;缺点是不可控、速度慢&#xff0c;优点是使用简单&#xff1b;而代码生成工具与AI的优缺点恰恰相反&#xff0c;如何结合两者的优…...

Android 回答视频边播放边下载的问题

分层次的回答突出 技术深度、架构思维 和 实战优化&#xff0c;从基础实现到高阶优化&#xff1a; 一、核心技术方案&#xff08;基础回答&#xff09; 如何实现视频边下边播&#xff1f; 1. **网络请求**&#xff1a;使用 HTTP Range 请求&#xff08;Header: Range: bytes0…...

【HarmonyOS 5】鸿蒙中如何使用MQTT

一、MQTT是什么&#xff1f; MQTT&#xff08;Message Queuing Telemetry Transport&#xff0c;消息队列遥测传输&#xff09;是一种轻量级、基于发布 / 订阅&#xff08;Publish/Subscribe&#xff09;模式的即时通讯协议&#xff0c;专为资源受限的物联网&#xff08;IoT&a…...

Conda与Pip:Python包管理工具的对比与选型

在当今的Python开发环境中&#xff0c;包管理工具的选择对于项目的顺利进行至关重要。Conda和Pip作为两种主流的Python包管理工具&#xff0c;各自具有独特的特点和优势。本文将详细对比Conda和Pip&#xff0c;帮助开发者在项目中做出更合适的选择。 一、概述 Conda&#xff…...

建筑兔零基础自学记录69|爬虫Requests-2

Requests库初步尝试 #导入requests库 import requests #requests.get读取百度网页 rrequests.get(http://www.baidu.com) #输出读取网页状态 print(r.status_code) #输出网页源代码 print(r.text) HTTP 状态码是三位数字&#xff0c;用于表示 HTTP 请求的结果。常见的状态码有…...

OpenCV——图像融合

OpenCV——图像融合 一、引言1.1 图像融合分类 二、C代码实现三、效果展示3.1 标准球3.2 铝制底座 一、引言 在许多计算机视觉应用中(例如机器人运动和医学成像)&#xff0c;需要将来自多幅图像的相关信息集成到一幅图像中。这种图像融合将提供更高的可靠性、准确性和数据质量…...

显示背光发烫异常解析

■显示屏问题描述&#xff1a;&#xff1a; 分辨率&#xff1a;1024x600 尺寸&#xff1a;7寸 16:9 显示模式&#xff1a;IPS 背光参数&#xff1a;3串10并 电压&#xff1a;9.6V 电流&#xff1a;200ma 问题描述&#xff1a;常温装填下&#xff0c;在整机点亮一段时间后&a…...

机器学习--数据填充

一、引言 在机器学习领域&#xff0c;数据的质量直接关乎模型的性能。而数据缺失是实际数据收集过程中极为常见的问题&#xff0c;它像一颗隐藏的 “暗雷”&#xff0c;随时可能影响模型训练的准确性与稳定性。数据填充作为解决数据缺失问题的核心手段之一&#xff0c;有着多种…...

【Linux】40.网络基础(2.2)

文章目录 2. 传输层2.1 再谈端口号2.1.1 端口号范围划分2.1.2 认识知名端口号2.1.3 netstat2.1.4 pidof 2.2 UDP协议2.2.1 UDP协议端格式2.2.2 UDP的特点2.2.3 面向数据报2.2.4 UDP的缓冲区2.2.5 UDP使用注意事项2.2.6 基于UDP的应用层协议 2.3 TCP协议2.3.1 TCP协议段格式2.3.…...

YOLOv12即插即用--CPAM

1.模块介绍 本文提出了一种新型基于注意尺度序列融合的 YOLO 框架,称为 ASF-YOLO,该框架结合空间与尺度信息,实现了高效且精确的细胞实例分割。在 YOLO 分割框架的基础上,设计了 尺度序列特征融合(SSFF)模块,用于增强多尺度信息提取能力;同时引入 三重特征编码器(TPE…...

工业制造核心术语

• BOM&#xff1a; Bill of Material。物料清单。根据物料所处的阶段不同&#xff0c;可分为不同视图&#xff1a;EBOM&#xff08;Engineering BOM&#xff0c;设计BOM&#xff09;、PBOM&#xff08;Process BOM&#xff09;工艺BOM、MBOM&#xff08;Manufacturing BOM&…...

实现一个 Markdown 编辑器组件:Vue 3 + Vite + Highlight.js

文章目录 一、项目背景与需求分析二、搭建基础项目1. 初始化 Vue 3 项目2. 安装依赖 三、实现 Markdown 编辑器组件1. 创建 Markdown 编辑器组件2. 组件说明 四、优化与拓展1. 自动保存功能2. 文件上传功能 五、总结 一、项目背景与需求分析 在现代前端开发中&#xff0c;Mark…...

海外交友APP多语音系统实现

一、逻辑分析 语音录制功能&#xff1a; 用户需要在 APP 中能够方便地触发语音录制操作。这涉及到调用设备的麦克风权限&#xff0c;获取音频输入流。录制的音频数据需要进行临时存储&#xff0c;以便后续处理和发送。 语音播放功能&#xff1a; 当接收到其他用户发送的语音消…...

VSCode、clangd、mingw 配置与使用

1.安装 安装如下软件&#xff1a; VSCodeclangd 扩展mingw-w64 2.配置 配置好 mingw-w64 到用户环境中。 在项目中设置 .clangd 扩展&#xff0c;设置 argument //setting.json"clangd.arguments": ["--query-driverD:\\Development\\Tools\\mingw64\\bin…...

Rust入门之迭代器(Iterators)

Rust入门之迭代器&#xff08;Iterators&#xff09; 本文已同步本人博客网站 本文相关源码已上传Github 前言 迭代器&#xff08;Iterators&#xff09;是 Rust 中最核心的工具之一&#xff0c;它不仅是遍历集合的抽象&#xff0c;更是 Rust 零成本抽象&#xff08;Zero-Co…...

Android 14 、15动态申请读写权限实现 (Java)

在 Android 14、15 中&#xff0c;Google 进一步优化了存储权限系统&#xff0c;特别是写权限的管理。以下是完整的 Java 实现方案&#xff1a; 1. AndroidManifest.xml 声明权限 <!-- Android 14 存储权限 --> <uses-permission android:name"android.permiss…...

Codeforces Round 1013 (Div. 3)

Problem - A - Codeforces 解题思路&#xff1a; 对每个需要的数字进行计数 #include<bits/stdc.h> using namespace std;int main() {int t;cin >> t;while (t--){int n;cin >> n;int two 2;int zero 3;int five 1;int three 1;int one 1;int flag …...

SAP-ABAP:SAP PO接口中System Landscape(SL Landscape Directory,SLD)作用详解

SAP PO接口中System Landscape(SL Landscape Directory,SLD)作用详解 System Landscape Directory(SLD)是SAP Process Orchestration(PO)的核心组件,用于管理企业IT系统中的所有技术组件、业务系统及其关联关系。以下是其关键作用及实现逻辑: 中央元数据仓库存储全局…...

从繁琐到高效,2025年AI PPT工具选秒出PPT

在如今快节奏的职场中&#xff0c;PPT已经成为了日常工作中不可或缺的一部分。然而&#xff0c;传统的PPT制作往往耗费大量时间&#xff0c;尤其是内容整理、排版和设计这些环节&#xff0c;经常让人头疼。如何在保证质量的同时提升制作效率&#xff0c;成为了每个职场人的难题…...