C++ 快速学习教程
文章目录
- 一、基础语法篇
- 1. 开发环境搭建
- 2. 程序结构
- 3. 基础数据类型
- 4. 流程控制
- 二、面向对象编程
- 1. 类与对象
- 2. 构造函数与析构函数
- 3. 继承与多态
- 4. 运算符重载
- 三、高级特性
- 1. 模板编程
- 2. 异常处理
- 3. 命名空间
- 4. 类型推导(auto/decltype)
- 四、标准库与 STL
- 1. 容器
- 2. 算法
- 3. 智能指针
- 4. 文件流操作
- 五、内存管理
- 1. 指针与引用
- 2. 堆与栈内存
- 3. 内存泄漏检测
- 4. 移动语义(C++11)
- 六、现代 C++ 特性
- 1. C++11/14/17/20 新特性
- 2. 多线程编程
- 七、项目实践
- 1. 代码规范(Google C++ Style)
- 2. 单元测试(Google Test)
- 3. 调试技巧(gdb/IDE 调试器)
一、基础语法篇
1. 开发环境搭建
- GCC/MinGW 编译器
- 详解:GCC 是 GNU 编译器套装,MinGW 是 Windows 平台上的 GCC 移植版。它们可以将 C++ 源代码编译成可执行文件。在 Linux 系统上通常默认安装了 GCC,而在 Windows 上可以通过安装 MinGW 来使用 GCC。
- 示例(Windows 下使用 MinGW):假设已经安装并配置好 MinGW,有一个简单的 C++ 源文件
hello.cpp
:
#include <iostream>int main() {std::cout << "Hello, MinGW!" << std::endl;return 0;
}
在命令行中使用 g++ hello.cpp -o hello.exe
进行编译,然后运行 hello.exe
即可看到输出。
- IDE 配置(VS/VSCode/CLion)
- 详解
- Visual Studio(VS):是微软的集成开发环境,功能强大,有丰富的调试和代码分析工具。
- Visual Studio Code(VSCode):轻量级的跨平台代码编辑器,通过安装 C++ 扩展可以实现 C++ 开发,支持代码高亮、智能代码补全等功能。
- CLion:JetBrains 开发的跨平台 C++ IDE,对 C++ 支持非常好,有智能代码提示、强大的调试功能等。
- 示例(VSCode):安装 C++ 扩展,安装 MinGW 并配置环境变量。创建一个新的 C++ 文件,编写上述
hello.cpp
代码,然后按F5
进行调试运行。
- 详解
2. 程序结构
- main 函数
- 详解:C++ 程序的执行从
main
函数开始。main
函数的返回值类型通常是int
,返回 0 表示程序正常结束,非 0 值表示程序异常结束。 - 示例:
- 详解:C++ 程序的执行从
#include <iostream>// main 函数是程序的入口点
int main() {std::cout << "This is the main function." << std::endl;return 0;
}
- 头文件与源文件
- 详解:头文件(通常以
.h
或.hpp
为扩展名)用于声明函数、类、常量等,源文件(通常以.cpp
为扩展名)用于实现头文件中声明的内容。这样做可以提高代码的模块化和可维护性。 - 示例:
example.h
- 详解:头文件(通常以
// 函数声明
void printMessage();
example.cpp
#include <iostream>
#include "example.h"// 函数实现
void printMessage() {std::cout << "This is a message from a function." << std::endl;
}
main.cpp
#include "example.h"int main() {printMessage();return 0;
}
3. 基础数据类型
- 整型 / 浮点型 / 字符型
- 详解
- 整型:用于表示整数,如
int
、short
、long
等。 - 浮点型:用于表示小数,如
float
、double
。 - 字符型:用于表示单个字符,如
char
。
- 整型:用于表示整数,如
- 示例:
- 详解
#include <iostream>int main() {// 整型int num = 10;// 浮点型double pi = 3.14159;// 字符型char ch = 'A';std::cout << "Integer: " << num << std::endl;std::cout << "Double: " << pi << std::endl;std::cout << "Character: " << ch << std::endl;return 0;
}
- 类型转换(static_cast 等)
- 详解:
static_cast
是一种编译时类型转换,用于在相关类型之间进行转换,如整数类型之间、浮点类型之间、整数和浮点类型之间等。它比 C 风格的强制类型转换更安全,因为它在编译时进行类型检查。 - 示例:
- 详解:
#include <iostream>int main() {double d = 3.14;// 使用 static_cast 进行类型转换int i = static_cast<int>(d);std::cout << "Double value: " << d << std::endl;std::cout << "Converted int value: " << i << std::endl;return 0;
}
4. 流程控制
- 条件语句(if - else/switch)
- 详解
- if - else:用于根据条件执行不同的代码块。
- switch:用于根据一个表达式的值选择执行多个代码块中的一个。
- 示例:
- 详解
#include <iostream>int main() {int num = 5;if (num > 0) {std::cout << "The number is positive." << std::endl;} else if (num < 0) {std::cout << "The number is negative." << std::endl;} else {std::cout << "The number is zero." << std::endl;}int choice = 2;switch (choice) {case 1:std::cout << "You chose option 1." << std::endl;break;case 2:std::cout << "You chose option 2." << std::endl;break;default:std::cout << "Invalid choice." << std::endl;}return 0;
}
- 循环结构(for/while/do - while)
- 详解
- for 循环:通常用于已知循环次数的情况。
- while 循环:在条件为真时重复执行代码块。
- do - while 循环:先执行一次代码块,然后在条件为真时继续执行。
- 示例:
- 详解
#include <iostream>int main() {// for 循环for (int i = 0; i < 5; ++i) {std::cout << "For loop iteration: " << i << std::endl;}// while 循环int j = 0;while (j < 3) {std::cout << "While loop iteration: " << j << std::endl;++j;}// do - while 循环int k = 0;do {std::cout << "Do - while loop iteration: " << k << std::endl;++k;} while (k < 2);return 0;
}
二、面向对象编程
1. 类与对象
- 成员变量 / 方法
- 详解:类是一种用户自定义的数据类型,它可以包含成员变量(数据成员)和成员方法(函数成员)。成员变量用于存储对象的状态,成员方法用于操作这些状态。
- 示例:
#include <iostream>// 定义一个简单的类
class Rectangle {
private:// 成员变量int width;int height;public:// 构造函数Rectangle(int w, int h) : width(w), height(h) {}// 成员方法int area() {return width * height;}
};int main() {// 创建对象Rectangle rect(5, 3);std::cout << "Rectangle area: " << rect.area() << std::endl;return 0;
}
- 访问控制(public/private/protected)
- 详解
- public:公有成员可以在类的外部被访问。
- private:私有成员只能在类的内部被访问,通常用于封装数据,防止外部直接修改。
- protected:受保护成员可以在类的内部和派生类中被访问。
- 示例:在上面的
Rectangle
类中,width
和height
是私有的,只能通过类的成员方法访问,保证了数据的安全性。
- 详解
2. 构造函数与析构函数
- 详解
- 构造函数:在创建对象时自动调用,用于初始化对象的成员变量。
- 析构函数:在对象销毁时自动调用,用于释放对象占用的资源。
- 示例:
#include <iostream>class MyClass {
public:// 构造函数MyClass() {std::cout << "Constructor called." << std::endl;}// 析构函数~MyClass() {std::cout << "Destructor called." << std::endl;}
};int main() {{MyClass obj;} // 当 obj 离开作用域时,析构函数会被调用return 0;
}
3. 继承与多态
- 虚函数与 override 关键字
- 详解
- 虚函数:在基类中用
virtual
关键字声明的函数,允许在派生类中重写。 - override 关键字:用于显式地表明派生类中的函数是重写基类的虚函数,避免因函数签名错误而导致的错误。
- 虚函数:在基类中用
- 示例:
- 详解
#include <iostream>// 基类
class Shape {
public:// 虚函数virtual void draw() {std::cout << "Drawing a shape." << std::endl;}
};// 派生类
class Circle : public Shape {
public:// 重写虚函数void draw() override {std::cout << "Drawing a circle." << std::endl;}
};int main() {Shape* shape = new Circle();shape->draw(); // 调用派生类的 draw 函数delete shape;return 0;
}
- 抽象类与接口
- 详解
- 抽象类:包含纯虚函数(用
= 0
声明的虚函数)的类,不能实例化,通常作为基类供其他类继承。 - 接口:在 C++ 中通常用抽象类来实现接口的概念,一个类可以继承多个抽象类来实现多个接口。
- 抽象类:包含纯虚函数(用
- 示例:
- 详解
#include <iostream>// 抽象类
class AbstractShape {
public:// 纯虚函数virtual void draw() = 0;
};// 派生类实现抽象类
class Square : public AbstractShape {
public:void draw() override {std::cout << "Drawing a square." << std::endl;}
};int main() {AbstractShape* shape = new Square();shape->draw();delete shape;return 0;
}
4. 运算符重载
- 详解:运算符重载允许自定义类的对象使用内置运算符(如
+
、-
、*
等)进行操作。通过重载运算符,可以使自定义类的对象的行为更像内置类型。 - 示例:
#include <iostream>class Complex {
private:double real;double imag;public:Complex(double r = 0.0, double i = 0.0) : real(r), imag(i) {}// 重载 + 运算符Complex operator+(const Complex& other) const {return Complex(real + other.real, imag + other.imag);}void print() {std::cout << real << " + " << imag << "i" << std::endl;}
};int main() {Complex c1(1.0, 2.0);Complex c2(3.0, 4.0);Complex c3 = c1 + c2;c3.print();return 0;
}
三、高级特性
1. 模板编程
- 函数模板
- 详解:函数模板是一种通用的函数定义,它可以处理不同类型的数据,通过模板参数来实现类型的参数化。编译器会根据调用时的实际参数类型生成具体的函数实例。
- 示例:
#include <iostream>// 函数模板
template <typename T>
T add(T a, T b) {return a + b;
}int main() {int result1 = add(1, 2);double result2 = add(1.5, 2.5);std::cout << "Int result: " << result1 << std::endl;std::cout << "Double result: " << result2 << std::endl;return 0;
}
- 类模板
- 详解:类模板是一种通用的类定义,它可以根据不同的类型参数生成不同的类。类似于函数模板,编译器会根据实际使用的类型生成具体的类实例。
- 示例:
#include <iostream>// 类模板
template <typename T>
class Pair {
private:T first;T second;public:Pair(T f, T s) : first(f), second(s) {}T getFirst() const {return first;}T getSecond() const {return second;}
};int main() {Pair<int> p(1, 2);std::cout << "First: " << p.getFirst() << ", Second: " << p.getSecond() << std::endl;return 0;
}
2. 异常处理
- 详解:异常处理机制允许程序在运行时处理错误和异常情况。
try
块中包含可能抛出异常的代码,catch
块用于捕获并处理异常,throw
语句用于抛出异常。 - 示例:
#include <iostream>int divide(int a, int b) {if (b == 0) {throw std::runtime_error("Division by zero!");}return a / b;
}int main() {try {int result = divide(10, 0);std::cout << "Result: " << result << std::endl;} catch (const std::runtime_error& e) {std::cout << "Exception caught: " << e.what() << std::endl;}return 0;
}
3. 命名空间
- 详解:命名空间用于避免命名冲突,将不同的代码模块或库中的名称分隔开来。可以在命名空间中定义变量、函数、类等。
- 示例:
#include <iostream>// 定义命名空间
namespace MyNamespace {int value = 42;void printValue() {std::cout << "Value in MyNamespace: " << value << std::endl;}
}int main() {// 使用命名空间中的成员MyNamespace::printValue();return 0;
}
4. 类型推导(auto/decltype)
- 详解
- auto:用于自动推导变量的类型,编译器会根据变量的初始化表达式来确定其类型。
- decltype:用于获取表达式的类型,常用于模板编程和泛型编程中。
- 示例:
#include <iostream>int main() {auto num = 10; // 自动推导为 int 类型decltype(num) anotherNum = 20; // 与 num 类型相同std::cout << "num: " << num << std::endl;std::cout << "anotherNum: " << anotherNum << std::endl;return 0;
}
四、标准库与 STL
1. 容器
- vector:动态数组,支持随机访问,元素在内存中连续存储。
#include <iostream>
#include <vector>int main() {std::vector<int> v;v.push_back(1);v.push_back(2);for (int i : v) {std::cout << i << " ";}std::cout << std::endl;return 0;
}
- list:双向链表,不支持随机访问,但插入和删除操作效率高。
#include <iostream>
#include <list>int main() {std::list<int> l;l.push_back(1);l.push_front(2);for (int i : l) {std::cout << i << " ";}std::cout << std::endl;return 0;
}
- map:关联容器,存储键值对,键是唯一的,元素按照键的顺序排序。
#include <iostream>
#include <map>int main() {std::map<std::string, int> m;m["apple"] = 10;m["banana"] = 20;for (const auto& pair : m) {std::cout << pair.first << ": " << pair.second << std::endl;}return 0;
}
2. 算法
- sort:对容器中的元素进行排序。
#include <iostream>
#include <vector>
#include <algorithm>int main() {std::vector<int> v = {3, 1, 2};std::sort(v.begin(), v.end());for (int i : v) {std::cout << i << " ";}std::cout << std::endl;return 0;
}
- find:在容器中查找指定元素。
#include <iostream>
#include <vector>
#include <algorithm>int main() {std::vector<int> v = {1, 2, 3};auto it = std::find(v.begin(), v.end(), 2);if (it != v.end()) {std::cout << "Found: " << *it << std::endl;} else {std::cout << "Not found" << std::endl;}return 0;
}
- transform:对容器中的元素进行变换。
#include <iostream>
#include <vector>
#include <algorithm>int square(int x) {return x * x;
}int main() {std::vector<int> v = {1, 2, 3};std::vector<int> result;std::transform(v.begin(), v.end(), std::back_inserter(result), square);for (int i : result) {std::cout << i << " ";}std::cout << std::endl;return 0;
}
3. 智能指针
- unique_ptr:独占式智能指针,同一时间只能有一个
unique_ptr
指向同一个对象。当unique_ptr
离开作用域时,它会自动释放所指向的对象。
#include <iostream>
#include <memory>int main() {std::unique_ptr<int> p(new int(10));std::cout << *p << std::endl;return 0;
}
- shared_ptr:共享式智能指针,多个
shared_ptr
可以指向同一个对象,通过引用计数来管理对象的生命周期。当引用计数为 0 时,对象会被自动释放。
#include <iostream>
#include <memory>int main() {std::shared_ptr<int> p1(new int(10));std::shared_ptr<int> p2 = p1;std::cout << *p1 << " " << *p2 << std::endl;return 0;
}
4. 文件流操作
- ifstream:用于读取文件。
#include <iostream>
#include <fstream>
#include <string>int main() {std::ifstream file("test.txt");if (file.is_open()) {std::string line;while (std::getline(file, line)) {std::cout << line << std::endl;}file.close();}return 0;
}
- ofstream:用于写入文件。
#include <iostream>
#include <fstream>int main() {std::ofstream file("test.txt");if (file.is_open()) {file << "Hello, World!" << std::endl;file.close();}return 0;
}
五、内存管理
1. 指针与引用
- 指针:存储变量的内存地址,可以通过解引用操作符
*
访问所指向的变量。
#include <iostream>int main() {int x = 10;int* p = &x;std::cout << *p << std::endl;return 0;
}
- 引用:是变量的别名,必须在定义时初始化,并且不能重新绑定到其他变量。
#include <iostream>int main() {int x = 10;int& ref = x;std::cout << ref << std::endl;return 0;
}
2. 堆与栈内存
- 栈内存:由编译器自动分配和释放,用于存储局部变量。栈内存的分配和释放速度快,但空间有限。
- 堆内存:由程序员手动分配和释放(使用
new
和delete
运算符),用于存储动态分配的对象。堆内存的空间较大,但分配和释放速度相对较慢,并且容易出现内存泄漏。
3. 内存泄漏检测
- Valgrind:一个流行的内存调试工具,可以检测内存泄漏、越界访问等问题。
valgrind --leak-check=full ./your_program
4. 移动语义(C++11)
- 移动构造函数和移动赋值运算符:用于避免不必要的拷贝操作,提高性能。例如,
std::vector
在移动时会直接转移资源的所有权,而不是进行拷贝。
#include <iostream>
#include <vector>class MyClass {
private:std::vector<int> data;
public:MyClass() = default;MyClass(const MyClass& other) : data(other.data) {std::cout << "Copy constructor" << std::endl;}MyClass(MyClass&& other) noexcept : data(std::move(other.data)) {std::cout << "Move constructor" << std::endl;}MyClass& operator=(const MyClass& other) {data = other.data;std::cout << "Copy assignment" << std::endl;return *this;}MyClass& operator=(MyClass&& other) noexcept {data = std::move(other.data);std::cout << "Move assignment" << std::endl;return *this;}
};int main() {MyClass a;MyClass b = std::move(a);return 0;
}
六、现代 C++ 特性
1. C++11/14/17/20 新特性
- lambda 表达式:一种匿名函数,可以方便地定义和使用函数对象。
#include <iostream>
#include <vector>
#include <algorithm>int main() {std::vector<int> v = {1, 2, 3};std::for_each(v.begin(), v.end(), [](int x) {std::cout << x << " ";});std::cout << std::endl;return 0;
}
- 范围 for 循环:一种简化的循环语法,用于遍历容器中的元素。
#include <iostream>
#include <vector>int main() {std::vector<int> v = {1, 2, 3};for (int i : v) {std::cout << i << " ";}std::cout << std::endl;return 0;
}
- constexpr:用于在编译时计算表达式的值,提高性能。
#include <iostream>constexpr int square(int x) {return x * x;
}int main() {constexpr int result = square(5);std::cout << result << std::endl;return 0;
}
2. 多线程编程
- thread/async
- std::thread:用于创建和管理线程。
#include <iostream>
#include <thread>void hello() {std::cout << "Hello from thread" << std::endl;
}int main() {std::thread t(hello);t.join();return 0;
}
- std::async:用于异步执行任务,返回一个
std::future
对象,可以用于获取任务的结果。
#include <iostream>
#include <future>int add(int a, int b) {return a + b;
}int main() {std::future<int> result = std::async(add, 1, 2);std::cout << result.get() << std::endl;return 0;
}
- 互斥锁 / 条件变量
- std:mutex:用于保护共享资源,防止多个线程同时访问。
- std::condition_variable:用于线程间的同步,一个线程可以等待某个条件满足,另一个线程可以通知条件已满足。
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>std::mutex mtx;
std::condition_variable cv;
bool ready = false;void worker() {std::unique_lock<std::mutex> lock(mtx);cv.wait(lock, []{ return ready; });std::cout << "Worker thread is running" << std::endl;
}int main() {std::thread t(worker);{std::lock_guard<std::mutex> lock(mtx);ready = true;}cv.notify_one();t.join();return 0;
}
七、项目实践
1. 代码规范(Google C++ Style)
- 遵循统一的代码规范可以提高代码的可读性和可维护性。Google C++ Style 是一种广泛使用的代码规范,包括命名约定、代码格式、注释风格等方面的规定。
2. 单元测试(Google Test)
- Google Test 是一个开源的 C++ 单元测试框架,可以帮助你编写和运行单元测试。
#include <gtest/gtest.h>int add(int a, int b) {return a + b;
}TEST(AddTest, PositiveNumbers) {EXPECT_EQ(add(1, 2), 3);
}int main(int argc, char** argv) {::testing::InitGoogleTest(&argc, argv);return RUN_ALL_TESTS();
}
3. 调试技巧(gdb/IDE 调试器)
- gdb:一个强大的命令行调试工具,可以用于设置断点
相关文章:
C++ 快速学习教程
文章目录 一、基础语法篇1. 开发环境搭建2. 程序结构3. 基础数据类型4. 流程控制 二、面向对象编程1. 类与对象2. 构造函数与析构函数3. 继承与多态4. 运算符重载 三、高级特性1. 模板编程2. 异常处理3. 命名空间4. 类型推导(auto/decltype) 四、标准库与…...
LlamaFactory-webui:训练大语言模型的入门级教程
LlamaFactory是一个开源框架,支持多种流行的语言模型,及多种微调技术,同时,以友好的交互式界面,简化了大语言模型的学习。 本章内容,从如何拉取,我已经搭建好的Llamafactory镜像开始࿰…...
ros安装rqt_joint_trajectory_controller
有时候,我们可以看到别人的代码里面有这个,但是这个是需要安装的。 <node name"gui_controller" pkg"rqt_joint_trajectory_controller" type"rqt_joint_trajectory_controller" />sudo apt-get install ros-noeti…...
PXE批量网络装机与Kickstart自动化安装工具
目录 一、系统装机的原理 1.1、系统装机方式 1.2、系统安装过程 二、PXE批量网络装机 2.1、PXE实现原理 2.2、搭建PXE实际案例 2.2.1、安装必要软件 2.2.2、搭建DHCP服务器 2.2.3、搭建TFTP服务器 2.2.4、挂载镜像并拷贝引导文件到tftp服务启动引导文件夹下 2.2.5、编…...
使用vscode导出Markdown的PDF无法显示数学公式的问题
我的硬件环境是M2的MacBook air,在vscode中使用了Markdown PDF来导出md文件对应的PDF。但不管导出html还是PDF文件,数学公式都是显示的源代码。 我看了许多教程,给的是这个方法:在md文件对应的html文件中加上以下代码:…...
SpringBoot 热部署
1、添加 DevTools 依赖 <!-- 热部署依赖 --> <dependency> <groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId> </dependency>2、在IDEA的菜单栏中依次选择“File”→“Settings”&#x…...
sqlmap:自动SQL注入和数据库接管工具
SQL 注入攻击是 Web 安全领域最常见的漏洞之一,今天给大家介绍一个自动化 SQL 注入和数据库接管工具:sqlmap。sqlmap 作为一款开源渗透测试工具,能帮助安全测试人员快速发现并利用 SQL 注入漏洞接管数据库服务器。 功能特性 sqlmap 使用 Pyt…...
labview中VISA串口出现异常的解决方案
前两天在做项目时发现,当用VISA串口读取指令时出现了回复异常的情况,不管发什么东西就一直乱回,针对这个情况,后面在VISA串口中加了一个VISA寄存器清零的函数。加了之后果然好多了,不会出现乱回的情况,但是…...
x64汇编下过程参数解析
简介 好久没上博客, 突然发现我的粉丝数变2700了, 真是这几个月涨的粉比我之前好几年的都多, 于是心血来潮来写一篇, 记录一下x64下的调用约定(这里的调用约定只针对windows平台) Windows下的x64程序的调用约定有别于x86下的"stdcall调用约定"以及"cdecl调用约…...
JavaScript 系列之:垃圾回收机制
前言 垃圾回收是一种自动内存管理机制,用于检测和清除不再使用的对象,以释放内存空间。当一个对象不再被引用时,垃圾回收器会将其标记为垃圾,然后在适当的时候清除这些垃圾对象,并将内存回收给系统以供其他对象使用。…...
18.6 大语言模型可解释性解密:打开AI黑箱的关键技术
大语言模型可解释性解密:打开AI黑箱的关键技术 关键词:模型可解释性, 注意力机制分析, 特征可视化, 探针技术, AI透明度 1. 可解释性核心价值与挑战 大模型可解释性研究致力于破解"输入-输出"间的认知黑箱,其技术价值可概括为: #mermaid-svg-oF7xAEMTxnQZ6mF7 …...
Jmeter接口自动化测试读取用例
一:环境准备 1.下载jxl.jar这个jar包 2.下载好之后,放到Jmeter的安装路径下的lib目录下 3.jxl.jar的作用:完成对Excel的读写以及修改操作 如何利用jmter操作excel的思路分析: 1,Excell一般有三个最重要的元素&…...
es 写入数据的工作原理是什么啊?es 查询数据的工作原理是什么啊?底层的 lucene 介绍一下呗?倒排索引了解吗?
Elasticsearch 写入数据的工作原理 1. 写入流程概述 当客户端向 Elasticsearch 发送写入请求时,会经历以下步骤: 客户端选择一个节点 作为 coordinating node(协调节点),发送请求。协调节点对文档进行路由ÿ…...
npm : 无法加载文件 E:\ProgramFiles\Nodejs\npm.ps1,因为在此系统上禁止运行脚本。
这个错误是因为 Windows 系统的 PowerShell 执行策略 限制了脚本的运行。默认情况下,PowerShell 的执行策略是 Restricted,即禁止运行任何脚本。以下是解决该问题的步骤: 1. 检查当前执行策略 打开 PowerShell(管理员权限&#x…...
Spark map与mapPartitions算子源码级深度解析
Spark map与mapPartitions算子源码级深度解析 一、核心源码结构差异 1. map算子实现逻辑 def map[U: ClassTag](f: T => U): RDD[U] = withScope {val cleanF = sc.clean(f)new MapPartitionsRDD[U, T](this, (context, pid, iter) => iter.map(cleanF)) }实现特征: …...
Docker搭建基于Rust语言的云原生可观测平台OpenObserve
文章目录 前言1. 安装Docker2. 创建并启动OpenObserve容器3. 本地访问测试4. 公网访问本地部署的OpenObserve4.1 内网穿透工具安装4.2 创建公网地址 5. 配置固定公网地址 前言 嘿,朋友们,今天我们要聊聊一个能让你在云原生世界里大展身手的秘密武器——…...
论文阅读:A comprehensive survey on model compression and acceleration
对模型压缩和加速的全面调查 阅读论文:A comprehensive survey on model compression and acceleration 摘要 背景:近年来,机器学习(ML)和深度学习(DL)在计算机视觉、自然语言处理、股票预测…...
IO流(师从韩顺平)
文章目录 文件什么是文件文件流 常用的文件操作创建文件对象相关构造器和方法应用案例 获取文件的相关信息应用案例 目录的操作和文件删除应用案例 IO 流原理及流的分类Java IO 流原理IO流的分类 IO 流体系图-常用的类IO 流体系图(重要!!&…...
Ubuntu+deepseek+Dify本地部署
1.deepseek本地部署 在Ollama官网下载 需要魔法下载 curl -fsSL https://ollama.com/install.sh | sh 在官网找到需要下载的deepseek模型版本 复制命令到终端 ollama run deepseek-r1:7b 停止ollama服务 sudo systemctl stop ollama # sudo systemctl stop ollama.servi…...
Java类中的this操作
在Java中,`this` 是一个关键字,用于引用当前对象的实例。它通常在类的方法或构造器中使用,主要有以下几种用途: 1. 区分成员变量和局部变量 当成员变量与局部变量同名时,使用 `this` 可以明确引用当前对象的成员变量。 public class Person { private String name; …...
云创智城YunCharge 新能源二轮、四轮充电解决方案(云快充、万马爱充、中电联、OCPP1.6J等多个私有单车、汽车充电协议)之新能源充电行业系统说明书
云创智城YunCharge 新能源充电行业系统说明书 ⚡官方文档 ⚡官网地址 1. 引言 随着全球环境保护和能源危机的加剧,新能源汽车行业得到了快速发展,充电基础设施建设也随之蓬勃发展。新能源充电行业系统旨在提供高效、便捷的充电服务,满足电…...
利用STM32TIM自制延迟函数实验
一、实验目的 掌握STM32定时器(TIM)的工作原理及配置方法学习使用HAL库实现微秒级/毫秒级延时函数理解定时器中断服务程序的编写规范 二、实验原理 定时器基础: STM32定时器包含向上计数器、向下计数器、中心对齐模式通过预分频器&#x…...
【STM32F103ZET6——库函数】6.PWM
目录 配置PWM输出引脚 使能引脚时钟 配置PWM 使能PWM 配置定时器 使能定时器时钟 使能定时器 例程 例程说明 main.h main.c PWM.h PWM.c led.h led.c DSQ.h DSQ.c 配置PWM输出引脚 PWM的输出引脚必须配置为复用功能。 注意:需要使用哪个引脚&…...
RabbitMQ系列(四)基本概念之Exchange
在 RabbitMQ 中,Exchange(交换机) 是消息路由的核心组件,负责根据规则将生产者发送的消息分发到对应的队列(Queue)中。以下是其核心功能与分类的详细说明: 一、Exchange 的核心作用 消息路由枢…...
解决“ReadTimeoutError:HTTPSConnectionPool”pip安装超时问题
安装pytorch时,出现如下报错信息: pip._vendor.urllib3.exceptions.ReadTimeoutError:HTTPSConnectionPool(host‘files.pythonhosted.org’, port443): Read timed out. 这是由于网络等各种原因导致安装超时引发的,可以按如下方式手动设置延…...
SAP中的屏幕PBO和PAI事件
PBO中的O,OUT,输出,和屏幕显示有关,比如屏幕元素的隐藏与显示,屏幕元素的输入状态的控制。 例如,控制屏幕所有元素为只读模式 LOOP AT SCREEN.SCREEN-INPUT 0.MODIFY SCREEN. ENDLOOP.PAI中的I,IN,输入,和屏幕输入有…...
Linux 环境“从零”部署 MongoDB 6.0:mongosh 安装与数据操作全攻略
前提 完成linux平台部署MongoDB【部署教程】且完成mongosh的安装 由于本人使用的是6.0版本的MongoDB,新版本 MongoDB(尤其是 6.0 及以上版本)已经不再默认捆绑传统的 mongo shell,而改用新的 MongoDB Shell(mongosh&am…...
Ubuntu 下 nginx-1.24.0 源码分析 - ngx_init_cycle 函数 - 详解(4)
详解(4) 初始化配置转储结构(config_dump) if (ngx_array_init(&cycle->config_dump, pool, 1, sizeof(ngx_conf_dump_t))! NGX_OK){ngx_destroy_pool(pool);return NULL;}ngx_rbtree_init(&cycle->config_dump_rb…...
Eclipse 编译项目指南
Eclipse 编译项目指南 引言 Eclipse 是一款功能强大的集成开发环境(IDE),广泛用于Java、C/C、Python等多种编程语言的开发。在Eclipse中编译项目是进行软件开发的基础步骤。本文将详细介绍如何在Eclipse中编译项目,包括项目设置…...
实现 Leaflet 多类型点位标记与聚合功能的实战经验分享
在现代的地理信息系统(GIS)应用中,地图功能是不可或缺的一部分。无论是展示商业网点、旅游景点还是公共服务设施,地图都能以直观的方式呈现数据。然而,当数据量较大时,地图上可能会出现大量的标记点&#x…...
C高级——shell(3)
一、shell的选择结构 1.回顾:C语言的选择结构:if , if else if ,if else,switch (switch的执行速度最快) 2.shell的选择结构: 单分支if 双分支 if else 多分支if elif case..in 1.1 shell的选择结构的格式 --------C语言的格式--…...
Qt 中,**信号与槽(Signals Slots)机制
在 Qt 中,信号与槽(Signals & Slots)机制 是实现对象间通信的核心模式,通常也被视为一种高效的“通知者模式”。它允许对象在特定事件发生时通知其他对象,且完全解耦。 核心概念 信号(Signal࿰…...
字符串复制函数strcpy()的使用仿写strcpy()——C语言
strcpy 函数是C语言标准库中的字符串处理函数,用于将一个字符串复制到另一个字符串中。 char *strcpy(char *dest, const char *src); dest 是目标字符串的指针,用于存储复制后的字符串。 src 是源字符串的指针,指向要被复制的字符串。 st…...
想知道两轮差速方形底盘 URDF 咋做,ROS2 配 Rviz 咋显示吗?看这里!
视频讲解 想知道两轮差速方形底盘 URDF 咋做,ROS2 配 Rviz 咋显示吗?看这里! 模型概述 一个方形底盘和两个差速驱动轮 URDF 代码 <?xml version"1.0" encoding"utf-8"?> <robot name"diff"> …...
什么是Ollama?什么是GGUF?二者之间有什么关系?
一、Ollama:本地化大模型运行框架 Ollama 是一款开源工具,专注于在本地环境中快速部署和运行大型语言模型(LLM)。它通过极简的命令行操作简化了模型管理流程,支持离线运行、多模型并行、私有化部署等场景。 核心特性 本地化运行:无需依赖云端API,用户可在个人电脑或服务…...
AI触手可及 | 基于函数计算玩转AI大模型
AI触手可及 | 基于函数计算玩转AI大模型 基于函数计算部署AI大模型的优势方案架构图像生成 - Stable Diffusion WebUI部署操作 释放资源部署总结体验反馈 在生成式AI技术加速迭代的浪潮下,百亿级参数的行业大模型正推动产业智能化范式转移。面对数字化转型竞赛&…...
VScode在Windows11中配置MSVC
因为MSVC编译器在vs当中,所以我们首先要安装vs的一部分组件。如果只是需要MSVC的话,工作负荷一个都不需要勾选,在单个组件里面搜索MSVC和windows11 SDK,其中一个是编译器,一个是头文件然后右下角安装即可。搜索Develop…...
基于SSM实现的bbs论坛系统功能实现四
一、前言介绍: 1.1 项目摘要 随着互联网技术的不断进步和普及,网络社区已成为人们获取信息、交流意见、分享经验的重要场所。BBS(Bulletin Board System,电子公告板系统)论坛系统作为网络社区的一种重要形式…...
Linux mount命令
Linux mount命令是经常会使用到的命令,它用于挂载Linux系统外的文件。 一、挂载功能介绍 挂载方法:mount DECE MOUNT_POINT 命令使用格式:mount [-fnrsvw] [-t vfstype] [-o options] device dir device:指明要挂载的设备&…...
【RAG生成】生成模块核心技术解密:从理论到实践的全链路优化
RAG知识系列文章 【RAG实践】手把手Python实现搭建本地知识问答系统【RAG进阶】从基础到模块化:深度解析RAG技术演进如何重塑AI知识边界【RAG检索】RAG技术揭秘:检索≠召回?【RAG增强】解密RAG系统排序优化:从基础原理到生产实践…...
JavaWeb-ServletContext应用域接口
文章目录 ServletContext接口简介获取一个ServletContext对象ServletContext接口中的相关方法获取应用域配置参数关于应用域参数的配置要求getContextPath获取项目路径getRealPath获取真实路径log系列方法添加相关日志增删查应用域属性 ServletContext接口简介 ServletContext…...
Vue3状态管理新选择:Pinia使用完全指南
一、为什么需要状态管理? 在Vue应用开发中,当我们的组件树变得复杂时,组件间的数据传递会成为棘手的问题。传统方案(如props/$emit)在多层嵌套组件中会变得笨拙,这时状态管理工具应运而生。Vue3带来了全新…...
权重生成图像
简介 前面提到的许多生成模型都有保存了生成器的权重,本章主要介绍如何使用训练好的权重文件通过生成器生成图像。 但是如何使用权重生成图像呢? 一、参数配置 ima_size 为图像尺寸,这个需要跟你模型训练的时候resize的时候一样。 latent_dim为噪声维度,一般的设置都是…...
【ESP32S3接入讯飞在线语音识别】
视频地址: 【ESP32S3接入讯飞在线语音识别】 1. 前言 使用Seeed XIAO ESP32S3 Sense开发板接入讯飞实现在线语音识别。自带麦克风模块用做语音输入,通过串口发送字符“1”来控制数据的采集和上传。 语音识别对比 平台api教程评分百度...
RISCV指令集解析
参考视频:《RISC-V入门&进阶教程》1-4-RV32I基本指令集(1)_哔哩哔哩_bilibili privilege是特权指令集,有点系统调用的感觉,要走内核态。unprivilege指令集有点像普通的函数调用。...
详解 c++ 中的 namespage
C 中的命名空间很特别,其他编程语言基本都没有。命名空间介于函数与类之间,兼顾了二者的一些优点。这篇博客根据 chatgpt 的回答整理。 文章目录 **1. 什么是 namespace(命名空间)?****2. 语法****3. 使用 namespace 访…...
Qt监控系统远程回放/录像文件远程下载/录像文件打上水印/批量多线程极速下载
一、前言说明 在做这个功能的时候,着实费了点心思,好在之前做ffmpeg加密解密的时候,已经打通了极速加密保存文件,主要就是之前的类中新增了进度提示信号,比如当前已经处理到哪个position位置,发个信号出来…...
Idea 和 Pycharm 快捷键
一、快捷键 二、Pycharm 中怎么切换分支 参考如下 如果在界面右下角 没有看到当前所在的分支,如 “Git:master” 3. 有了 4....
在 Mac mini M2 上本地部署 DeepSeek-R1:14B:使用 Ollama 和 Chatbox 的完整指南
随着人工智能技术的飞速发展,本地部署大型语言模型(LLM)已成为许多技术爱好者的热门选择。本地部署不仅能够保护隐私,还能提供更灵活的使用体验。本文将详细介绍如何在 Mac mini M2(24GB 内存)上部署 DeepS…...
2024年国赛高教杯数学建模A题板凳龙闹元宵解题全过程文档及程序
2024年国赛高教杯数学建模 A题 板凳龙闹元宵 原题再现 “板凳龙”,又称“盘龙”,是浙闽地区的传统地方民俗文化活动。人们将少则几十条,多则上百条的板凳首尾相连,形成蜿蜒曲折的板凳龙。盘龙时,龙头在前领头&#x…...