CPP生成随机数
1.
传统方法:rand()和
srand()(C语言风格,不推荐在新项目中使用)
工作原理:
rand(): 返回一个伪随机数,范围通常是 0到
RAND_MAX(一个常量,如 32767)。
srand(seed):
设置随机数种子。如果使用相同的种子,rand()会产生相同的序列。
缺点:
低质量:生成的随机数序列质量通常不高。
范围固定:范围固定为
[0, RAND_MAX],需要手动取模来调整范围,但这会引入偏差。
全局状态:使用全局状态,可能影响程序其他部分。
性能:在某些实现中性能不佳。
示例:
#include <iostream>#include <cstdlib> // 需要包含的头文件#include <ctime>int main() { // 用当前时间作为种子 std::srand(std::time(nullptr)); // 生成一个 0 到 RAND_MAX 之间的随机数 int random_num = std::rand();...
CMake调库
您说得对!让我重新整理,将同类型的库合并介绍,让结构更清晰。
CMake中的库类型完整分类
1.
Header-Only库(纯头文件库)
特点
所有代码都在头文件中
编译时直接内联
不需要链接库文件
项目中的使用
# 设置包含路径include_directories(external/cpp-httplib) # httplib.hinclude_directories(external/websocketpp) # websocketpp头文件include_directories(external/json-develop/include) # json.hpp# 在源文件中直接包含#include "httplib.h"#include <websocketpp/...>#include <nlohmann/json.hpp>
其他Header-Only库示例
# 更多Header-Only库include_directories(external/spdlog) ...
stoi的使用方法
stoi是 C++
中用于将字符串转换为整数的函数。以下是详细的使用方法:
基本语法
#include <string>using namespace std;int stoi(const string& str, size_t* pos = 0, int base = 10);
1. 基本用法
#include <iostream>#include <string>using namespace std;int main() { // 最简单的用法 string numStr = "123"; int num = stoi(numStr); cout << num << endl; // 输出: 123 // 带负号的数字 string negative = "-456"; int negNum = stoi(negative); cout << negNum <<...
数论
一、判断质数
方法 1:试除法
时间复杂度:O(√n)
原理:若 n不是质数,则必有因数 ≤
√n。
bool is_prime(int n) { for (int i = 2; i * i <= n; i++) { if (n % i == 0) { return false; } } return n >= 2; // 1 不是质数}
二、最大公约数(GCD)
方法 1:欧几里得算法(递归)
时间复杂度:O(log min(a, b))
原理:gcd(a, b) = gcd(b, a % b)
int gcd(int a, int b) { return b == 0 ? a : gcd(b, a % b);}
方法
2:迭代版(避免递归栈溢出)
int gcd(int a, int b) { while (b != 0) ...
C++滑动窗口算法模板
C++ 滑动窗口算法模板
1. 固定窗口大小
int fixedSlidingWindow(vector<int>& nums, int k) { int n = nums.size(); int sum = 0; // 计算初始窗口 for (int i = 0; i < k; i++) { sum += nums[i]; } int maxSum = sum; // 滑动窗口 for (int i = k; i < n; i++) { sum += nums[i] - nums[i - k]; // 加新元素,减旧元素 maxSum = max(maxSum, sum); } return maxSum;}
2. 可变窗口大小(求最大窗口)
3.无重复字符的最长子串
class Solution {public: ...
Pimpl模式
Pimpl(Pointer
to Implementation)模式简介
Pimpl(Pointer to Implementation),也称为
“Opaque Pointer”(不透明指针) 或 “Compilation
Firewall”(编译防火墙),是一种 C++
设计模式,用于隐藏类的实现细节,从而减少编译依赖、提高编译速度,并增强接口的稳定性。
1. Pimpl 的核心思想
将类的实现细节(私有成员)移动到一个单独的类(Impl)中
在公共接口类中仅保留一个指向实现类的指针
公共头文件(.h)仅包含声明,不暴露私有成员
传统类 vs. Pimpl 类
传统方式(暴露私有成员)
// Widget.h#include <string>#include <vector>class Widget {public: Widget(); void doSomething();private: std::string name; std::vector<int>...
CPP顺序型容器-list链表
std::list是 C++
标准库中的双向链表容器,支持高效的元素插入和删除操作。以下是
std::list的完整 API 参考。
1. 构造函数
方法
描述
时间复杂度
list<T> l
创建空 list
O(1)
list<T> l(count)
创建包含 count 个默认构造元素的
list
O(n)
list<T> l(count, value)
创建包含 count 个 value 的 list
O(n)
list<T> l(begin, end)
用迭代器范围初始化
O(n)
list<T> l(initializer_list)
用初始化列表初始化
O(n)
list<T> l(other_list)
拷贝构造函数
O(n)
list<T> l(move(other_list))
移动构造函数
O(1)
2....
操作系统基础知识
线程同步方式有哪些?
线程同步机制是指在多线程编程中,为了保证线程之间的互不干扰,而采用的一种机制。常见的线程同步机制有以下几种:
互斥锁:互斥锁是最常见的线程同步机制。它允许只有一个线程同时访问被保护的临界区(共享资源)
条件变量:条件变量用于线程间通信,允许一个线程等待某个条件满足,而其他线程可以发出信号通知等待线程。通常与互斥锁一起使用。
读写锁:
读写锁允许多个线程同时读取共享资源,但只允许一个线程写入资源。
信号量:用于控制多个线程对共享资源进行访问的工具。
1. 互斥锁 (Mutex - Mutual
Exclusion)
原理:像一把钥匙,只允许一个线程进入被保护的代码段(临界区)。其他线程必须等待该线程释放锁。
类比:一个单人的卫生间,一个人进去后从里面锁门,其他人只能在门口等待。
示例(C++ std::mutex):
#include <iostream>#include <thread>#include <mutex>std::mutex mtx; // 全局互斥锁int...
计算机网络基础知识
什么是MIME类型?
MIME:Multipurpose Internet Mail Extensions
作用:告诉浏览器如何处理接收到的内容
常见的MIME类型
// HTML文档res.set_content(content, "text/html");// CSS样式表res.set_content(css_content, "text/css");// JavaScript文件res.set_content(js_content, "application/javascript");// 图片文件res.set_content(image_data, "image/png");res.set_content(image_data, "image/jpeg");// JSON数据res.set_content(json_data, "application/json");
C++基础知识
...