杂乱的一些note
-
数据的种类记得辨别,有小数点记得用double
-
判断质数的函数:
bool is_prime(int n){ //判断是否是质数的函数 if(n<=1||(n%2==0&&n!=2)){ return false; } else if(n==2){ return true; } for(int i=3;i<=sqrt(n);i+=2){ if(n%i==0){ return false; } } return true; } -
运用memset来初始化各类数组
1.基本语法
memset(指针, 值, 字节数)2.重要特性
只能安全地设置 0 和 -1:对于 int、long 等多字节类型
可以设置任意值:对于 char、bool 等单字节类型3.常见使用场景
// ✅ 正确用法 int arr[100]; memset(arr, 0, sizeof(arr)); // 初始化为0 memset(arr, -1, sizeof(arr)); // 初始化为-1 bool visited[100]; memset(visited, false, sizeof(visited)); // false = 0 memset(visited, true, sizeof(visited)); // true ≠ 0,但通常工作正常char str[100]; memset(str, 'A', sizeof(str)); // 可以设置任意字符 // ❌ 错误用法 int dp[100]; memset(dp, 1, sizeof(dp)); // 想设置为1,实际设置为16843009替代方案 当需要初始化为0或-1以外的值时: // 方法1:使用循环 for (int i = 0; i < n; i++) { arr[i] = 1; } // 方法2:使用fill函数(C++) fill(arr, arr + n, 1); // 方法3:初始化时直接赋值 int arr[100] = {1}; // 只有arr[0]=1,其余为0: //其他例子:三维数组 bool computed[21][21][21]; memset(computed, false, sizeof(computed)); // 全部设为false -
回溯法
算法模版
void backtrack(参数) { if (终止条件) { 收集结果; return; } for (所有选择) { if (剪枝条件) continue; 做选择; backtrack(新状态); 撤销选择; // 关键 } } -
递归和递推
以斐波那契数列求解对比
// 记忆化递归(递归+缓存) int memo[100]; bool computed[100] = {false}; int fibonacci_memo(int n) { cout << "计算 F(" << n << ")"; if (computed[n]) { cout << " (已缓存)" << endl; return memo[n]; } cout << endl; if (n <= 1) { memo[n] = n; computed[n] = true; return n; } memo[n] = fibonacci_memo(n-1) + fibonacci_memo(n-2); computed[n] = true; return memo[n]; } // 递推方法(动态规划) int fibonacci_iterative(int n) { if (n <= 1) return n; vector<int> dp(n+1); dp[0] = 0; dp[1] = 1; cout << "递推过程:" << endl; cout << "F(0) = " << dp[0] << endl; cout << "F(1) = " << dp[1] << endl; for (int i = 2; i <= n; i++) { dp[i] = dp[i-1] + dp[i-2]; cout << "F(" << i << ") = F(" << (i-1) << ") + F(" << (i-2) << ") = " << dp[i] << endl; } return dp[n]; } -
vscode异常
Exception has occurred. Arithmetic exception-算数异常,通常是分母为零 -
fib数列记忆优化
long long ans[30000010]; long long fib(long long n){ if(n==0){ return 0; } if(n==1){ return 1; } if(ans[n]!=-1){ return ans[n]; } else{ ans[n] = fib(n-1)+fib(n-2); return ans[n]; } } -
觉得很细节的习惯性设置数组的MAX
const int MAXN = 10010; int a[MAXN],b[MAXN],g[MAXN],k[MAXN]; -
字符串分割
//若是要在读入的时候读到某个特定字符之前进行分割 #include<string> int main(){ string str; getline(cin,str,'#'); // 最多读取99个字符(留1个给'\0'),遇到'#'停止 } //ps:若是char str[]类型,格式会略有不同 int main() { char str[100]; // 字符数组,用于存储结果 // 最多读取99个字符(留1个给'\0'),遇到'#'停止 cin.getline(str, 100, '#'); cout << "读取结果:" << str << endl; return 0; } -
map
Map就像C语言中的"字典"或"键值对数组",可以通过key快速找到value。
1.基本操作
#include <map> std::map<std::string, int> age; // 名字 -> 年龄 // 插入/修改(类似数组) age["Alice"] = 25; age["Bob"] = 30; age["Alice"] = 26; // 修改Alice的年龄 // 查找 if (age.count("Alice")) { // 检查key是否存在 printf("Alice的年龄: %d\n", age["Alice"]); } // 安全查找(不存在不会自动创建) auto it = age.find("Charlie"); if (it != age.end()) { printf("年龄: %d\n", it->second); // it->first是key, it->second是value } else { printf("Charlie不存在\n"); } // 删除 age.erase("Bob"); // 遍历 for (auto& pair : age) { printf("%s: %d岁\n", pair.first.c_str(), pair.second); }2.基本应用
场景1:计数器
// C语言风格:需要数组足够大 int count[1000] = {0}; count[num]++; // C++ map:不需要担心范围 std::map<int, int> count; count[num]++; // 自动初始化为0再加1 // 统计单词出现次数 std::map<std::string, int> wordCount; wordCount["hello"]++; wordCount["world"]++; wordCount["hello"]++; // hello: 2, world: 1场景2:映射关系
// 学生ID -> 成绩 map<int, int> scores; scores[1001] = 95; scores[1002] = 87; // 坐标 -> 属性 map<pair<int,int>,string> grid; grid[{0, 0}] = "起点"; grid[{10, 10}] = "终点";场景3:用字符串做key(C语言很难做)
// C语言:需要strcmp,很麻烦 // C++ map:直接用字符串 std::map<std::string, std::string> dict; dict["apple"] = "苹果"; dict["banana"] = "香蕉"; printf("%s\n", dict["apple"].c_str()); // 输出: 苹果 -
set
set<int> s; // 插入元素(类似 C 中需要手动实现的插入) s.insert(10); s.insert(20); s.insert(10); // 不会重复插入,set自动去重 // 删除元素 s.erase(10); // 删除值为10的元素 // 查找元素(这是set最强大的地方!) if (s.count(20)) { // count返回0或1 printf("20存在\n"); } // 或者用find if (s.find(20) != s.end()) { // end()类似于NULL printf("20存在\n"); } // 获取大小 printf("大小: %zu\n", s.size()); // 清空 s.clear(); // 判断是否为空 if (s.empty()) { printf("set为空\n"); } -
string好用的函数汇总
🔍 查找相关
// 查找子串 size_t pos = str.find("sub"); // 查找首次出现 size_t pos = str.rfind("sub"); // 从后往前查找 size_t pos = str.find_first_of("aeiou"); // 查找任意字符首次出现 size_t pos = str.find_last_of("aeiou"); // 查找任意字符最后出现 // C++23 新增 bool contains = str.contains("sub"); // 检查是否包含子串📏 长度和容量
str.length(); // 字符串长度 str.size(); // 同 length() str.empty(); // 检查是否为空✂️ 子串操作
// 获取子串 string sub = str.substr(pos, count); // 从pos开始取count个字符 //若超出了则到结尾即终止,因此count的大小不是很重要 string sub = str.substr(pos); // 从pos到结尾 // 删除 str.erase(pos, count); // 删除从pos开始的count个字符 str.erase(iterator); // 删除迭代器位置 str.erase(start_it, end_it); // 删除迭代器范围 /*e.g string s6 = str; s6.erase(s6.begin() + 7, s6.begin() + 13); // 删除"World!" cout << "6. erase(iter1, iter2): " << s6 << std::endl; // 结果: "Hello, Programming is fun!" */ str.clear(); // 清空字符串 // 插入(此处的插入都是插在前面) str.insert(pos, "text"); // 在pos处插入 str.insert(pos, count, 'c'); // 插入count个字符c //这里如果count超出了str的结尾则到结尾就终止

浙公网安备 33010602011771号