【C++学习笔记】十三、速通笔记
完整的C++编程教程
目录
- 开发环境配置
- C++知识体系
- 现代C++特性
- 设计模式
- 数据结构
- CMake项目构建
- 调试技巧
- 进阶主题
- 学习资源
1. 开发环境配置
1.1 安装编译器
sudo apt-get install g++ build-essential
1.2 安装构建工具
sudo apt-get install cmake
1.3 VS Code配置
- 安装C++扩展
- 配置调试环境
- 安装CMake Tools扩展
2. C++知识体系
2.1 基础语法
#include <iostream>int main() {std::cout << "Hello World!" << std::endl;return 0;
}
2.2 面向对象编程
class MyClass {
public:MyClass() {}~MyClass() {}void print() {std::cout << "MyClass instance" << std::endl;}
};
3. 现代C++特性
3.1 自动类型推导
auto x = 5; // 自动推导为int
auto str = "hello"; // 自动推导为const char*
3.2 Lambda表达式
auto sum = [](int a, int b) { return a + b; };
std::cout << sum(3, 4) << std::endl; // 输出7
4. 设计模式
4.1 单例模式
class Singleton {
private:Singleton() {}public:static Singleton& instance() {static Singleton instance;return instance;}
};
UML图
+------------------+
| Singleton |
+------------------+
| - instance: static Singleton |
+------------------+
| + getInstance(): static Singleton& |
+------------------+
应用场景:
- 全局配置管理
- 日志系统
- 数据库连接池
- 缓存系统
- 线程池
性能分析:
- 线程安全(C++11后static局部变量初始化是线程安全的)
- 延迟初始化
- 内存效率高
- 首次调用可能有轻微性能开销
现代C++改进:
// 使用std::call_once确保线程安全
class ThreadSafeSingleton {
private:ThreadSafeSingleton() {}static std::once_flag initFlag;static std::unique_ptr<ThreadSafeSingleton> instance;public:static ThreadSafeSingleton& getInstance() {std::call_once(initFlag, []() {instance.reset(new ThreadSafeSingleton());});return *instance;}
};
4.1 单例模式
class Singleton {
private:Singleton() {}public:static Singleton& instance() {static Singleton instance;return instance;}
};
UML图
+------------------+
| Singleton |
+------------------+
| - instance: static Singleton |
+------------------+
| + getInstance(): static Singleton& |
+------------------+
应用场景:
- 全局配置管理
- 日志系统
- 数据库连接池
- 缓存系统
- 线程池
性能分析:
- 线程安全(C++11后static局部变量初始化是线程安全的)
- 延迟初始化
- 内存效率高
- 首次调用可能有轻微性能开销
现代C++改进:
// 使用std::call_once确保线程安全
class ThreadSafeSingleton {
private:ThreadSafeSingleton() {}static std::once_flag initFlag;static std::unique_ptr<ThreadSafeSingleton> instance;public:static ThreadSafeSingleton& getInstance() {std::call_once(initFlag, []() {instance.reset(new ThreadSafeSingleton());});return *instance;}
};
4.2 工厂模式
class Product {
public:virtual ~Product() {}virtual void operation() = 0;
};class ConcreteProductA : public Product {
public:void operation() override {std::cout << "ConcreteProductA operation" << std::endl;}
};class ConcreteProductB : public Product {
public:void operation() override {std::cout << "ConcreteProductB operation" << std::endl;}
};class Factory {
public:virtual Product* createProduct() = 0;
};class ConcreteFactoryA : public Factory {
public:Product* createProduct() override {return new ConcreteProductA();}
};class ConcreteFactoryB : public Factory {
public:Product* createProduct() override {return new ConcreteProductB();}
};
UML图
+------------------+ +------------------+
| Product |<------| ConcreteProductA |
+------------------+ +------------------+
| + operation(): virtual | +------------------+
+------------------+ | ConcreteProductB |+------------------++------------------+ +------------------+
| Factory |<------| ConcreteFactoryA |
+------------------+ +------------------+
| + createProduct(): virtual | +------------------+
+------------------+ | ConcreteFactoryB |+------------------+
应用场景:
- 需要创建多种相似对象
- 对象创建逻辑复杂
- 需要解耦客户端和具体产品类
- 需要动态扩展产品类型
- 需要集中管理对象创建
性能分析:
- 虚函数调用开销
- 对象创建成本
- 内存分配开销
现代C++改进:
// 使用智能指针避免内存泄漏
template<typename T>
std::unique_ptr<Product> createProduct() {return std::make_unique<T>();
}// 使用模板工厂
template<typename ProductType>
class TemplateFactory {
public:std::unique_ptr<Product> create() {return std::make_unique<ProductType>();}
};// 使用lambda工厂
auto productFactory = [](auto&&... args) {return std::make_unique<Product>(std::forward<decltype(args)>(args)...);
};
class Product {
public:virtual ~Product() {}virtual void operation() = 0;
};class ConcreteProductA : public Product {
public:void operation() override {std::cout << "ConcreteProductA operation" << std::endl;}
};class ConcreteProductB : public Product {
public:void operation() override {std::cout << "ConcreteProductB operation" << std::endl;}
};class Factory {
public:virtual Product* createProduct() = 0;
};class ConcreteFactoryA : public Factory {
public:Product* createProduct() override {return new ConcreteProductA();}
};class ConcreteFactoryB : public Factory {
public:Product* createProduct() override {return new ConcreteProductB();}
};
UML图
+------------------+ +------------------+
| Product |<------| ConcreteProductA |
+------------------+ +------------------+
| + operation(): virtual | +------------------+
+------------------+ | ConcreteProductB |+------------------++------------------+ +------------------+
| Factory |<------| ConcreteFactoryA |
+------------------+ +------------------+
| + createProduct(): virtual | +------------------+
+------------------+ | ConcreteFactoryB |+------------------+
应用场景:
- 需要创建多种相似对象
- 对象创建逻辑复杂
- 需要解耦客户端和具体产品类
- 需要动态扩展产品类型
- 需要集中管理对象创建
性能分析:
- 虚函数调用开销
- 对象创建成本
- 内存分配开销
现代C++改进:
// 使用智能指针避免内存泄漏
template<typename T>
std::unique_ptr<Product> createProduct() {return std::make_unique<T>();
}// 使用模板工厂
template<typename ProductType>
class TemplateFactory {
public:std::unique_ptr<Product> create() {return std::make_unique<ProductType>();}
};// 使用lambda工厂
auto productFactory = [](auto&&... args) {return std::make_unique<Product>(std::forward<decltype(args)>(args)...);
};
4.3 观察者模式
#include <vector>
#include <algorithm>
#include <memory>
#include <mutex>
#include <functional>
#include <unordered_map>
#include <any>// 基础观察者接口
class Observer {
public:virtual ~Observer() = default;virtual void update(const std::string& message) = 0;
};// 主题/被观察者
class Subject {
private:std::vector<std::weak_ptr<Observer>> observers;std::mutex mtx;public:// 线程安全的观察者注册void attach(std::shared_ptr<Observer> obs) {std::lock_guard<std::mutex> lock(mtx);observers.emplace_back(obs);}// 线程安全的观察者注销void detach(std::shared_ptr<Observer> obs) {std::lock_guard<std::mutex> lock(mtx);observers.erase(std::remove_if(observers.begin(), observers.end(),[&obs](const std::weak_ptr<Observer>& weakObs) {return weakObs.expired() || weakObs.lock() == obs;}),observers.end());}// 线程安全的通知所有观察者void notify(const std::string& message) {std::lock_guard<std::mutex> lock(mtx);for (auto it = observers.begin(); it != observers.end(); ) {if (auto obs = it->lock()) {obs->update(message);++it;} else {it = observers.erase(it);}}}
};// 具体观察者实现
class ConcreteObserver : public Observer {std::string name;
public:explicit ConcreteObserver(std::string name) : name(std::move(name)) {}void update(const std::string& message) override {std::cout << "Observer " << name << " received: " << message << std::endl;}
};// 现代C++改进:使用std::function和lambda
class Observable {std::vector<std::function<void(const std::string&)>> observers;std::mutex mtx;public:void subscribe(std::function<void(const std::string&)> observer) {std::lock_guard<std::mutex> lock(mtx);observers.push_back(observer);}void unsubscribe(std::function<void(const std::string&)> observer) {std::lock_guard<std::mutex> lock(mtx);observers.erase(std::remove(observers.begin(), observers.end(), observer),observers.end());}void notify(const std::string& message) {std::lock_guard<std::mutex> lock(mtx);for (auto& observer : observers) {observer(message);}}
};// C++20 协程改进
struct EventAwaiter {Observable& observable;std::string message;bool ready = false;EventAwaiter(Observable& obs) : observable(obs) {observable.subscribe([this](const std::string& msg) {message = msg;ready = true;});}bool await_ready() const { return ready; }void await_suspend(std::coroutine_handle<>) {}std::string await_resume() { return message; }
};// 使用示例
Task asyncEventListener(Observable& observable) {auto message = co_await EventAwaiter(observable);std::cout << "Received async message: " << message << std::endl;
}// 使用示例
int main() {// 传统观察者模式使用auto subject = std::make_shared<Subject>();auto observer1 = std::make_shared<ConcreteObserver>("Observer1");auto observer2 = std::make_shared<ConcreteObserver>("Observer2");subject->attach(observer1);subject->attach(observer2);subject->notify("Hello World!");// 现代C++风格使用Observable modernSubject;auto callback = [](const std::string& msg) {std::cout << "Lambda observer received: " << msg << std::endl;};modernSubject.subscribe(callback);modernSubject.notify("Modern C++ message");return 0;
}
UML图
+------------------+ +------------------+
| Subject |<>----->| Observer |
+------------------+ +------------------+
| + attach(Observer) | | + update(): virtual |
| + detach(Observer) | +------------------+
| + notify() | ^
+------------------+ ||+------------------+| ConcreteObserver |+------------------+
应用场景:
- 事件驱动系统
- GUI组件交互
- 发布-订阅系统
- 状态监控
- 数据同步
- 微服务架构中的事件通知
- 物联网设备状态更新
- 金融交易实时监控
- 游戏引擎事件处理
- 分布式系统状态同步
性能优化:
- 使用weak_ptr避免内存泄漏
- 异步通知减少阻塞
- 批量通知优化
- 线程安全实现
- 观察者去重
- 使用对象池管理观察者
- 事件过滤减少不必要通知
- 按优先级分组通知
- 使用无锁数据结构优化高频事件
- 事件合并减少通知频率
现代C++改进:
// 使用信号槽库
#include <boost/signals2.hpp>struct Event {void operator()() {std::cout << "Event triggered" << std::endl;}
};boost::signals2::signal<void()> signal;
signal.connect(Event());
signal();// 使用std::function和lambda
class Observable {std::vector<std::function<void(const std::string&)>> observers;
public:void subscribe(std::function<void(const std::string&)> observer) {observers.push_back(observer);}void notify(const std::string& message) {for (auto& observer : observers) {observer(message);}}
};
5. 数据结构
5.1 链表实现
struct Node {int data;Node* next;
};class LinkedList {Node* head;
public:void insert(int data) {Node* newNode = new Node{data, head};head = newNode;}
};
6. CMake项目构建
cmake_minimum_required(VERSION 3.10)
project(MyProject)set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)add_executable(myapp main.cpp)
7. 调试技巧
- 使用gdb调试
- 打印变量值
- 设置断点
- 查看调用栈
8. 进阶主题
8.1 模板元编程
// C++20 概念(Concepts)示例
template<typename T>
concept Numeric = std::is_arithmetic_v<T>;template<Numeric T>
T square(T x) {return x * x;
}// 编译期字符串处理
constexpr size_t string_length(const char* str) {return *str ? 1 + string_length(str + 1) : 0;
}// C++23 编译期反射提案示例
/*
struct Person {std::string name;int age;
};constexpr auto members = reflect(Person);
static_assert(members.size() == 2);
static_assert(members[0].name == "name");
*/
应用场景:
- 编译期类型检查
- 领域特定嵌入式语言(EDSL)
- 序列化/反序列化框架
- 高性能数学库
- 编译期数据结构
性能优化技巧:
- 使用constexpr if减少实例化
- 模板特化优化热点路径
- 使用变量模板缓存中间结果
- 编译期字符串哈希优化查找
- 使用折叠表达式简化可变参数模板
template<int N>
struct Factorial {static const int value = N * Factorial<N-1>::value;
};template<>
struct Factorial<0> {static const int value = 1;
};// 编译期断言
static_assert(Factorial<5>::value == 120, "Factorial calculation error");
现代C++改进(C++11/14/17):
// C++11 constexpr函数
constexpr int factorial(int n) {return n <= 1 ? 1 : n * factorial(n - 1);
}// C++14 constexpr函数改进
constexpr auto factorial14(auto n) {decltype(n) result = 1;for (decltype(n) i = 1; i <= n; ++i) {result *= i;}return result;
}// C++17 变量模板
template<auto N>
constexpr auto factorial17 = N * factorial17<N-1>;template<>
constexpr auto factorial17<0> = 1;// C++20 consteval函数
consteval int compile_time_factorial(int n) {return n <= 1 ? 1 : n * compile_time_factorial(n - 1);
}
应用场景:
- 编译期计算
- 类型特征检查
- 代码生成
- 算法优化
- 领域特定语言(DSL)
性能分析:
- 零运行时开销
- 增加编译时间
- 可能增加二进制大小
高级技巧:
// SFINAE (Substitution Failure Is Not An Error)
template<typename T>
auto print_type_info(const T& t) -> decltype(t.toString(), void()) {std::cout << t.toString() << std::endl;
}template<typename T>
auto print_type_info(const T& t) -> decltype(t.to_string(), void()) {std::cout << t.to_string() << std::endl;
}template<typename T>
auto print_type_info(const T& t) -> decltype(std::cout << t, void()) {std::cout << t << std::endl;
}// 类型特征
template<typename T>
struct is_pointer {static constexpr bool value = false;
};template<typename T>
struct is_pointer<T*> {static constexpr bool value = true;
};// 使用if constexpr (C++17)
template<typename T>
auto process(const T& t) {if constexpr (is_pointer<T>::value) {std::cout << "Pointer to " << *t << std::endl;} else {std::cout << "Value " << t << std::endl;}
}
8.2 并发编程
#include <thread>
#include <iostream>
#include <mutex>
#include <latch>
#include <barrier>
#include <semaphore>// C++20 新特性示例
void concurrent_operations() {// std::latch 一次性屏障std::latch work_done(3);// std::barrier 可重用屏障std::barrier sync_point(3);// std::counting_semaphore 信号量std::counting_semaphore<10> sem(3);auto worker = [&](int id) {std::cout << "Worker " << id << " started" << std::endl;// 模拟工作std::this_thread::sleep_for(std::chrono::milliseconds(100 * id));// 使用信号量sem.acquire();std::cout << "Worker " << id << " acquired semaphore" << std::endl;sem.release();// 到达同步点work_done.count_down();sync_point.arrive_and_wait();std::cout << "Worker " << id << " completed" << std::endl;};std::jthread t1(worker, 1);std::jthread t2(worker, 2);std::jthread t3(worker, 3);work_done.wait();std::cout << "All workers finished initial phase" << std::endl;
}#include <thread>
#include <iostream>
#include <mutex>
#include <vector>
#include <future>
#include <condition_variable>
#include <atomic>
#include <queue>// 基本线程同步
std::mutex mtx;
std::condition_variable cv;
bool ready = false;void worker_thread() {std::unique_lock<std::mutex> lock(mtx);cv.wait(lock, []{ return ready; });std::cout << "Worker thread is processing data" << std::endl;
}// 线程安全队列
template<typename T>
class ThreadSafeQueue {std::queue<T> queue;mutable std::mutex mtx;std::condition_variable cv;public:void push(T value) {std::lock_guard<std::mutex> lock(mtx);queue.push(std::move(value));cv.notify_one();}bool try_pop(T& value) {std::lock_guard<std::mutex> lock(mtx);if (queue.empty()) return false;value = std::move(queue.front());queue.pop();return true;}void wait_and_pop(T& value) {std::unique_lock<std::mutex> lock(mtx);cv.wait(lock, [this]{ return !queue.empty(); });value = std::move(queue.front());queue.pop();}
};// 原子操作
std::atomic<int> counter(0);void increment_atomic() {for (int i = 0; i < 1000; ++i) {++counter;}
}int main() {// 基本线程示例std::thread worker(worker_thread);{std::lock_guard<std::mutex> lock(mtx);ready = true;}cv.notify_one();worker.join();// 线程池示例const unsigned num_threads = std::thread::hardware_concurrency();std::vector<std::thread> threads;// 创建线程池工作函数auto worker = [](int id) {std::cout << "Thread " << id << " 开始工作" << std::endl;// 模拟工作负载std::this_thread::sleep_for(std::chrono::milliseconds(100));std::cout << "Thread " << id << " 完成工作" << std::endl;};// 启动所有工作线程for (unsigned i = 0; i < num_threads; ++i) {threads.emplace_back(worker, i);}// 等待所有线程完成for (auto& t : threads) {if (t.joinable()) {t.join();}}std::cout << "所有线程任务已完成" << std::endl;
8.3 内存管理
#include <memory>
#include <memory_resource>
#include <vector>// 内存对齐分配示例 (C++17)
template<typename T>
struct AlignedAllocator {using value_type = T;explicit AlignedAllocator(size_t alignment = alignof(T)) : alignment(alignment) {if (alignment & (alignment - 1)) {throw std::invalid_argument("Alignment must be power of two");}}template<typename U>AlignedAllocator(const AlignedAllocator<U>& other) noexcept : alignment(other.alignment) {}[[nodiscard]] T* allocate(size_t n) {if (n > std::numeric_limits<size_t>::max() / sizeof(T)) {throw std::bad_alloc();}size_t size = n * sizeof(T);void* ptr = std::aligned_alloc(alignment, size);if (!ptr) {throw std::bad_alloc();}return static_cast<T*>(ptr);}void deallocate(T* p, size_t n) noexcept {std::free(p);}bool operator==(const AlignedAllocator&) const noexcept { return true; }bool operator!=(const AlignedAllocator&) const noexcept { return false; }size_t alignment;
};// 使用示例
std::vector<int, AlignedAllocator<int>> aligned_vec(AlignedAllocator<int>(64));// 自定义内存池分配器 (C++11)
template<typename T>
class PoolAllocator {struct Block {Block* next;};Block* freeList = nullptr;public:using value_type = T;using propagate_on_container_copy_assignment = std::true_type;using propagate_on_container_move_assignment = std::true_type;using propagate_on_container_swap = std::true_type;explicit PoolAllocator(size_t poolSize = 1024) {if (poolSize == 0) {throw std::invalid_argument("Pool size must be positive");}// 预分配内存池freeList = static_cast<Block*>(::operator new(poolSize * sizeof(T)));// 初始化空闲链表Block* current = freeList;for (size_t i = 0; i < poolSize - 1; ++i) {current->next = reinterpret_cast<Block*>(reinterpret_cast<char*>(current) + sizeof(T));current = current->next;}current->next = nullptr;}PoolAllocator(const PoolAllocator&) = delete;PoolAllocator& operator=(const PoolAllocator&) = delete;[[nodiscard]] T* allocate(size_t n) {if (n != 1 || !freeList) {throw std::bad_alloc();}Block* block = freeList;freeList = freeList->next;return reinterpret_cast<T*>(block);}void deallocate(T* p, size_t n) noexcept {if (n != 1 || !p) return;Block* block = reinterpret_cast<Block*>(p);block->next = freeList;freeList = block;}template<typename U>struct rebind {using other = PoolAllocator<U>;};
};// 使用示例
std::vector<int, PoolAllocator<int>> vec(PoolAllocator<int>(100));// 现代C++内存管理特性
/*
1. 智能指针 (C++11):- std::unique_ptr: 独占所有权- std::shared_ptr: 共享所有权- std::weak_ptr: 打破循环引用2. 内存资源 (C++17):- std::pmr::memory_resource- std::pmr::polymorphic_allocator- 内置内存资源 (monotonic, pool, synchronized)3. 垃圾回收支持 (C++11):- std::declare_reachable- std::undeclare_reachable- std::declare_no_pointers- std::undeclare_no_pointers4. 内存模型 (C++11):- std::atomic- 内存顺序约束- 线程安全保证
*/
现代C++内存管理特性:
1. 内存资源(Memory Resources)
```cpp
class MonotonicResource : public std::pmr::memory_resource {void* current = nullptr;size_t remaining = 0;protected:void* do_allocate(size_t bytes, size_t alignment) override {// 简单线性分配实现void* p = std::align(alignment, bytes, current, remaining);if (!p) throw std::bad_alloc();current = static_cast<char*>(p) + bytes;remaining -= bytes;return p;}void do_deallocate(void*, size_t, size_t) override {}bool do_is_equal(const memory_resource& other) const noexcept override {return this == &other;}
};
- 多态内存资源
- 栈分配器(stack allocator)
- 内存池优化
性能分析工具:
- Valgrind
- AddressSanitizer
- MemorySanitizer
- ThreadSanitizer
- 自定义分配器性能测试方法
#include <memory>class Resource {
public:Resource() { std::cout << "Resource acquired" << std::endl; }~Resource() { std::cout << "Resource released" << std::endl; }
};int main() {// 使用智能指针自动管理内存auto ptr = std::make_unique<Resource>();// 移动语义示例auto ptr2 = std::move(ptr); // 所有权转移// 共享所有权auto shared = std::make_shared<Resource>();return 0;
}
现代C++特性:
- 移动语义(std::move)
- 完美转发
- RAII原则
9. 学习资源
- 《C++ Primer》
- 《Effective C++》
- cppreference.com
- Stack Overflow C++社区
相关文章:
【C++学习笔记】十三、速通笔记
完整的C编程教程 目录 开发环境配置C知识体系现代C特性设计模式数据结构CMake项目构建调试技巧进阶主题学习资源 1. 开发环境配置 1.1 安装编译器 sudo apt-get install g build-essential1.2 安装构建工具 sudo apt-get install cmake1.3 VS Code配置 安装C扩展配置调试…...
硬件电路(23)-输入隔离高低电平有效切换电路
一、概述 项目中为了防止信号干扰需要加一些隔离电路,而且有时传感器的信号是高有效有时是低有效,所以基于此背景,设计了一款方便实现高低电平有效检测切换电路。 二、应用电路...
基于深度学习的多模态癌症数据集调研
基于深度学习的多模态癌症数据集调研 关键词: 癌症、分割、多模态、radiology、pathology、深度学习 目录: 一、 数据集总结 二、 胶质瘤/脑肿瘤(glioma) 三、 肺癌/非小细胞肺癌(NSCLC) 四、 乳腺癌&am…...
Logo语言的系统监控
Logo语言的系统监控 引言 在信息技术飞速发展的时代,系统监控成为了确保计算机系统和网络平稳运行的重要手段。系统监控不仅可以实时跟踪系统的性能、资源使用情况和安全风险等,还能够在出现问题时及时发出警报,从而避免潜在的故障和损失。…...
Go语言-初学者日记(八):构建、部署与 Docker 化
🧱 一、go build:最基础的构建方式 Go 的构建工具链是出了名的轻量、简洁,直接用 go build 就能把项目编译成二进制文件。 ✅ 构建当前项目 go build -o myapp-o myapp 指定输出文件名默认会构建当前目录下的 main.go 或 package main &a…...
青少年编程与数学 02-015 大学数学知识点 08课题、信息论
青少年编程与数学 02-015 大学数学知识点 08课题、信息论 一、信息论基础二、熵与信息量三、信源编码四、信道编码五、率失真理论六、信息论的应用七、网络信息论八、信息论与统计学习九、量子信息论十、信息论的前沿研究总结 信息论是研究信息传输、存储和处理的数学理论&…...
【已解决】Webstorm 每次使用 git pull/push 都要输入令牌/密码登录
解决办法:勾上【使用凭据帮助程序】(英文:Use credential helper)...
FreeRTOS:嵌入式实时操作系统的轻量化解决方案
一、FreeRTOS 的核心定位 FreeRTOS(Free Real-Time Operating System)是一款专为微控制器及资源受限的嵌入式设备设计的开源实时操作系统内核。自2003年由Richard Barry发布以来,其以轻量化、高实时性、低资源占用的特点,成为物…...
Linux操作系统 4.Linux实用操作
一、各类小技巧(快捷键) 强制停止 退出、登出 历史命令搜索 光标移动 1.CTRL C 强制停止 1.Linux某些程序的运行,如果想要强行停止它,可以使用ctrlc 2.命令输入错误,也可以通过快捷键ctrl c,退出当前输入࿰…...
学透Spring Boot — 010. 单元测试和Spring Test
系列文章目录 这是CSDN postnull 博客《学透Spring Boot》系列的一篇,更多文章请移步:Postnull - 学透Spring Boot系列文章 文章目录 系列文章目录前言1. 基本概念UT 单元测试TDD 测试驱动开发UT测试框架Mock框架 3. Spring Test为什么要用Spring Test引…...
Perl语言的文件系统
Perl语言中的文件系统操作 引言 在软件开发中,文件系统操作是一个不可或缺的部分。无论是简单的文件读取、写入,还是复杂的文件管理,合理的文件系统操作都能极大提升程序的效率和可维护性。Perl语言是一种强大的文本处理语言,凭…...
ffmpeg基础指令学习
文章目录 1. **基本的 FFmpeg 语法**2. **常见的 FFmpeg 基础指令****1. 转换视频格式****2. 视频剪切****3. 转换视频的编码****4. 提取音频****5. 改变视频分辨率****6. 改变音视频的比特率****7. 合并音视频****8. 提取视频中的一帧图片****9. 提取视频的帧速率(…...
英国电商物流变革:ebay私人卖家如何借势简易配送提升履约效率?
近年来,英国电商物流正在经历一场不小的变革。从“等待5-7个工作日”到如今“次日达”成为常态,市场和用户对配送效率的要求越来越高。对于在 eBay 平台上的私人卖家来说,这既是挑战,也是机会。如何用有限的资源跟上平台和消费者对…...
第15周:注意力汇聚:Nadaraya-Watson 核回归
注意力汇聚:Nadaraya-Watson 核回归 Nadaraya-Watson 核回归是一个经典的注意力机制模型,它展示了如何通过注意力权重来对输入数据进行加权平均。以下是该内容的核心总结: 关键概念 注意力机制框架:由查询(自主提示…...
批量图片文本识别重命名,批量ocr识别图片重命名,基于WPF和腾讯OCR云部署实,现批量对图片局部提取文字后重命名的操作详细步骤
1. 项目背景 在日常工作中,我们经常需要处理大量图片文件,这些图片可能包含重要的文字信息。为了提高工作效率,我们需要一种自动化的方式,从图片中提取文字,并根据提取的文字对图片进行重命名。 本项目基于 WPF 框架开发桌面应用程序,结合 腾讯 OCR…...
26考研——排序(8)
408答疑 文章目录 一、排序的基本概念二、插入排序三、交换排序四、选择排序五、归并排序、基数排序和计数排序六、排序的代码实操七、各种内部排序算法的比较及应用八、外部排序九、参考资料鲍鱼科技课件26王道考研书 十、总结基本排序算法希尔排序快速排序、堆排序和归并排序…...
KUKA机器人导入设备说明文件
KUKA机器人在应用中需要进行通讯配置,通讯前需要导入设备说明文件,比如常用的倍福设备说明文件。在Workvisual软件上通过以下步骤即可导入设备说明文件。 一、打开Workvisual软件,在选项卡【File】下找到【Import/Export】输入/输出并点击打…...
ssl.SSLCertVerificationError报错解决方案
这个错误 ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate 指出 Python 在尝试建立安全的 HTTPS 连接时,无法验证远程服务器(在此案例中是 GitHub 或 Hugging Face…...
drawio导出流程图为白色背景png图片
draw.io 操作路径: 1.纯白背景图片(一般导出流程图就这种纯白背景,看自己需求 什么都不勾选 导出效果图 2.田字格白背景 只勾选网格 导出效果图 3.方块背景 只勾选背景 导出效果图 4.大方块背景 都勾选 导出效果图...
【Linux】——手撕线程池、简易线程池
前言 在现代计算机编程领域,随着多核处理器和分布式系统的广泛应用,并发编程变得越来越重要。而线程作为实现并发的基本手段之一,其重要性不言而喻。然而,在实际的应用开发中,如何高效地管理和调度线程,以充…...
使用mcp自定义编写mcp tool,使用 conda 启动,在cline中配置使用
自定义 mcp tool 例子 ## /langchain_learn/mcp学习/base_mcp_tool_study2.py # 导入必要模块 import os from typing import Optional from mcp.server.fastmcp import FastMCP# 初始化 MCP 服务器实例,指定服务器名称和版本 mcp_server FastMCP(name"DemoS…...
OpenEuler/CentOS一键部署OpenGauss数据库教程(脚本+视频)
📌OpenEuler/CentOS一键安装OpenGauss数据库教程 为什么需要OpenGauss一键安装脚本? 手动部署OpenGauss数据库时,环境适配、依赖冲突等问题常让开发者头疼。尤其对新人而言,官方文档的配置步骤可能耗时数小时甚至引发未知报错。 …...
python如何快速删除文件夹中的大量文件
在 Python 中,删除文件夹中的大量小图片文件可以通过使用 os 模块或 shutil 模块来实现。以下是一个示例代码,展示了如何快速删除指定文件夹中的所有文件。如果你只需要删除小图片文件,可以添加额外的逻辑来检查文件大小。 以下是一个示例代…...
【mongodb】MongoDB的应用场景
目录 1.说明2.内容管理系统(CMS)2.1 场景描述2.2 MongoDB优势2.3 示例 3.实时分析与大数据3.1 场景描述3.2 MongoDB优势3.3 示例 4.移动应用后端4.1 场景描述4.2 MongoDB优势4.3 示例 5.游戏开发5.1 场景描述5.2 MongoDB优势5.3 示例 6.电子商务平台6.1 …...
使用 Swift 实现 LRU 缓存淘汰策略
📌 实现思路 一、核心目标 我们要实现一个缓存类: 支持通过 get(key) 获取缓存的值;支持通过 put(key, value) 写入缓存;缓存容量有限,当超过容量时要淘汰最久未使用的元素。 二、为什么用「哈希表 双向链表」 功…...
【面试篇】Dubbo
基础概念 问题:请简要介绍一下 Dubbo 是什么,它的主要用途是什么?答案:Dubbo 是阿里巴巴开源的高性能、轻量级的分布式服务框架,它致力于提供高性能和透明化的 RPC 远程服务调用方案,以及 SOA 服务治理方案…...
01-STM32(介绍、工具准备、新建工程)p1-4
文章目录 工具准备和介绍硬件设备stm32简介和arm简介stm32简介STM32命名规则STM32选型STM32F103C8T6最小系统板引脚定义STM32启动配置STM32最小系统电路ARM简介 软件安装注册器件支持包安装ST-LINK驱动安装USB转串口驱动 新建工程创建stm32工程STM32工程编译和下载型号分类及缩…...
关于termux运行pc交叉编译的aarch64 elf的问题
在Linux系统上交叉编译Nim程序到Android Termux环境需要特殊处理,以下是详细的解决方案: 问题根源分析 ABI不兼容 Android使用bionic libc而非标准glibc,直接编译的Linux ARM二进制无法直接运行 动态链接错误 默认编译会链…...
Ansible Playbook 进阶探秘:Handlers、变量、循环及条件判断全解析
192.168.60.100ansible.com192.168.60.110 client-1.com 192.168.60.120client-2.com192.168.60.130client-1.com 一、Handlers 介绍:在发生改变时执行的操作(类似puppet通知机制) 示例: 当apache的配置文件发生改变时,apache服务才会重启…...
解决GraalVM Native Maven Plugin错误:JAVA_HOME未指向GraalVM Distribution
目录 问题描述解决方案为什么需要这样配置? 问题描述 在你的项目中,如果你遇到了以下错误信息: [ERROR] Failed to execute goal org.graalvm.buildtools:native-maven-plugin:0.10.5:test (native-test) on project DIctSystemInJavaUsing…...
006贪心——算法备赛
跨步问题 跳跃游戏|| 问题描述 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向后跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i j] 处: 0 < j < nums[i]i j &…...
Hyperlane:高性能 Rust HTTP 服务器框架评测
Hyperlane:高性能 Rust HTTP 服务器框架评测 在当今快速发展的互联网时代,选择一个高效、可靠的 HTTP 服务器框架对于开发者来说至关重要。最近,我在评估各种服务器框架性能时,发现了一个名为 Hyperlane 的 Rust HTTP 服务器库&a…...
解锁多元养生密码,开启活力生活
在车水马龙、节奏飞快的现代社会,亚健康像阴霾一样,笼罩着不少人的生活。不少上班族长期久坐,肩颈酸痛;有的人作息混乱,皮肤状态差。想要驱散这些健康阴霾,拥抱活力生活,不妨解锁下面这些多元养…...
如何安全地访问AWS
如何安全地访问AWS 推荐超级课程: 本地离线DeepSeek AI方案部署实战教程【完全版】Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战目录 如何安全地访问AWS当可以使用AWS Organizations & IAM Identity Center时理想的访问方式补充:什么是IAM IIC…...
机器视觉工程师的专业精度决定职业高度,而专注密度决定成长速度。低质量的合群,不如高质量独处
在机器视觉行业,真正的技术突破往往诞生于深度思考与有效碰撞的辩证统一。建议采用「70%高质量独处30%精准社交」的钻石结构,构建可验证的技术能力护城河。记住:你的专业精度决定职业高度,而专注密度决定成长速度。 作为机器视觉工…...
Linux的 `sysctl` 命令 笔记250404
Linux的 sysctl 命令 笔记250404 sysctl 是 Linux 系统中用于 动态查看和修改内核运行时参数 的核心工具。它通过 /proc/sys/ 目录的虚拟文件系统接口,允许用户在不重启系统的前提下调整内核行为,涵盖网络、内存、文件系统等关键功能。 📜 核…...
prism WPF 导航
导航和浏览器的后退前进是一样的功能 项目结构 App.xaml.cs using Prism.Ioc; using Prism.Modularity; using Prism.Unity; using PrismWpfApp.ViewModels; using PrismWpfApp.Views; using System; using System.Collections.Generic; using System.Configuration; using S…...
Pytorch实现线性分类
目录 1.导包 2.加载数据 3.获取X与Y数据 4.将X,Y数据转化成tensor张量, tensor张量必须是二维数据 5.用封装的API实现线性分类 5.1导包 5.2建模-神经网络(二分类问题) 5.3定义损失函数 5.4定义优化器 5.5定义训练过程 5.6 计算正确…...
使用人工智能大模型kimi,如何免费高效制作PPT?
今天我们学习人工智能大模型kimi,如何免费协助我们做班会PPT。 免费手把手讲解视频,请访问 https://edu.csdn.net/learn/40402/666417 第一步使用谷歌浏览器,搜索Kimi,看到Kimi智能助手,点击,在Kimi对话框…...
YOLO学习笔记 | 基于YOLO与光流融合的车牌识别方法研究(附Matlab代码)
🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓 基于YOLO与光流融合的车牌识别方法研究 🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓 摘要 针对动态场景下车牌识别易受运动模糊影响的问题,提出结合YOLO目标检测与Lucas-Kanade…...
leetcode 数组总结篇
基础理论 数组:下标时从 0 开始的,地址是连续的,不能删除,只能覆盖;数组的实现:vector动态数组 常用操作 头文件 #include <iostream> #include <vector> #include <cstdint> // IN…...
CCF GESP C++编程 四级认证真题 2025年3月
C 四级 2025 年 03 月 题号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 答案 A B B D D C D D B B B B A A C 1 单选题(每题 2 分,共 30 分) 第 1 题 关于下述代码,说法错误的是( )。 int multiply(int x, int …...
元宇宙浪潮下,前端开发如何“乘风破浪”?
一、元宇宙对前端开发的新要求 元宇宙的兴起,为前端开发领域带来了全新的挑战与机遇。元宇宙作为一个高度集成、多维互动的虚拟世界,要求前端开发不仅具备传统网页开发的能力,还需要掌握虚拟现实(VR)、增强现实&#…...
室内指路机器人是否支持环境监测功能?
并非所有室内指路机器人都具备环境监测功能。那些支持环境监测的室内指路机器人,往往在设计上进行了针对性的优化,搭载了一系列先进且实用的传感器。温湿度传感器犹如一位敏锐的 “温度湿度侦探”,时刻精准地监测室内温度与湿度,为…...
redis的数据类型(1)
https://redis.io/docs/latest/develop/data-types/strings/ 社区版支持: String,字符串 Hash,key-value格式 List,根据插入顺序排序 Set,集合 Sorted set,有排序 Stream, Bitmap, …...
模运算核心性质与算法应用:从数学原理到编程实践
目录 🚀前言🌟数学性质:模运算的理论基石💯基本定义:余数的本质💯四则运算规则:保持同余性的关键 🦜编程实践:模运算的工程化技巧💯避免数值溢出:…...
使用 Messenger 跨进程通讯
在Android中使用Messenger进行跨进程通信(IPC)的步骤如下: 1. 服务端(Service)实现 1.1 创建Service并绑定Messenger public class MessengerService extends Service {private static final String TAG "Mess…...
css炫酷的3D水波纹文字效果实现详解
炫酷的3D水波纹文字效果实现详解 这里写目录标题 炫酷的3D水波纹文字效果实现详解项目概述技术栈核心实现1. 基础布局2. 渐变背景3. 文字效果实现3.1 基础样式3.2 文字漂浮动画 4. 水波纹效果4.1 模糊效果4.2 水波动画 5. 交互效果 技术要点项目难点与解决方案总结 项目概述 在…...
C++类的特殊成员函数:构造、拷贝构造与析构函数详解
目录 编辑一、构造函数 二、拷贝构造函数 三、析构函数 在C 编程中,类的特殊成员函数扮演着至关重要的角色,它们负责对象的创建、复制以及销毁过程。本文将深入探讨构造函数、拷贝构造函数和析构函数的概念、特性及应用场景,并结合代…...
ffmpeg常见命令3
文章目录 1. **文字水印(Text Watermark)**示例命令:更多选项: 2. **图片水印(Image Watermark)**示例命令:更多选项: 3. **画中画(Picture-in-Picture, PIP)…...