![](https://img-blog.csdnimg.cn/20210303175100300.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
C/C++
C/C++ 笔记
hanjialeOK
世上无难事,只怕有心人!
展开
-
[C/C++] 静态类型与动态类型
反过来基类的指针或引用,转为派生类时,可能会出问题,因为基类不包含派生类。static_cast在编译期强制转换,不做安全检查(因为没法做安全检查,编译期间不知道动态类型),非常危险。dynamic_cast可以根据动态类型做安全检查,如果动态类型不是指向派生类指针,就不做转换。基类的指针或引用,转为派生类时,需要在运行期间做安全检查,因为编译期间不知道指针或引用是不是指向派生类,而我们想访问派生类自己特有的类成员。基类的指针或引用,调用虚函数时,会发生动态绑定,根据指针或引用的动态类型来执行对应的函数。原创 2023-04-07 20:00:02 · 170 阅读 · 0 评论 -
[C/C++] 手写一个简单的共享指针
使用 valgrind 工具查看是否有内存泄露。行为像指针的类(共享指针)原创 2023-04-05 11:44:57 · 494 阅读 · 0 评论 -
[C++] 二分查找 lower_bound() 与 upper_bound()
当有序数组中有多个重复元素时,二分查找就出现了 lower_bound 和 upper_bound,这两个函数都可以直接调用。自己实现 lower_bound 和 upper_bound。二分查找,非常适合在有序数组中进行查找,时间复杂度为。原创 2023-02-07 21:37:39 · 260 阅读 · 0 评论 -
[C++] 字符串 string
string 转 int,long,long long。string 删除所有空格。int 转 string。原创 2023-02-07 12:04:40 · 164 阅读 · 0 评论 -
[C++] 数据结构 priority_queue
如果存储的是 pair 类型,默认会使用 pair 中的第一个元素进行比较,第一个元素相等你则会比较第二个。优先队列(priority_queue)其实就是堆,默认是大顶堆,即 top() 会返回堆顶元素(最大)。如果想要自定义比较函数,比较麻烦…原创 2023-02-06 11:41:52 · 520 阅读 · 0 评论 -
c++中移位运算符优先级
然后我意识到移位运算符得优先级低于加法,也就是说应该携程下面形式。的值可能会超过 int 最大范围,因此得更改写法。然后发现程序死循环了,我写成下面的形式就没问题。今天写二分代码的时候,我计算mid使用移位。原创 2023-01-02 17:06:11 · 132 阅读 · 0 评论 -
链表指针长度
typedef struct node{ int data; struct node* next;}Node;指针长度与指向的数据无关,与系统有关,在 32 位系统上是 4 个字节,在 64 位系统上是 8 个字节。在 linux86-64 系统上,指针 next 占 8 个字节。整形 data 占 4 个字节,系统为了对齐,会自动将 data 扩充到 8 个字节,因此结构体一共 16 个字节。int main(){ Node n; printf("%d\n",原创 2021-09-13 20:28:15 · 346 阅读 · 0 评论 -
最长严格递减子序列
3,其递减子序列只能为 3。2,2 < 3,可以组成 32,所以最长子序列是 32。9,9 > 2,9 > 3,最长子序列只能是 9。1,1 < 3,1 < 2,1 < 9,可以构成 31,321,91,所以最长子序列是 321。以此类推 3291876 332-31--- -2-321--- --991989796 ---1--- ----8987986 -----79876原创 2021-06-13 22:11:59 · 833 阅读 · 0 评论 -
[C/C++] gdb 调试
查看多个变量的值p {var1, var2, var3}每次自动打印多个变量的值disp {var1, var2, var3}原创 2021-04-16 19:45:18 · 99 阅读 · 0 评论 -
[C++] 引用 &
执行下面一段代码后,a 和 b 的值均变为 1。#include <iostream>using namespace std;int main(){ int a = 10; int& b = a; a = 1; cout << a << " " << b << endl;}原创 2021-04-07 17:39:33 · 51 阅读 · 0 评论 -
[Linux] C 语言遍历文件夹
头文件#include <dirent.h>int main(int argc, char* argv[]){ DIR *dir = NULL; struct dirent *file; if((dir = opendir("../images/")) == NULL) { printf("opendir failed!"); return -1; } while(file = readdir(dir)) {; if (file->d_type == 4)原创 2021-04-04 21:13:16 · 964 阅读 · 0 评论 -
[C++] string
string 初始化# 初始化一个空字符串string str;# 拷贝初始化string str(str1);string 拼接string str;str += " ";string 比较string a, b;if(a == b) ;原创 2021-03-13 13:17:25 · 61 阅读 · 0 评论 -
[C++] pair
当存在一对二的关系时,使用 map+pair 组合map<TreeNode*, pair<int, vector<int>>> mm;mm[root] = make_pair(root->val, vector<int>(1, 10)); 访问 pair 中的元素mm[root].firstmm[root].second原创 2021-03-11 10:39:41 · 65 阅读 · 0 评论 -
[C++] vector 初始化
默认vector<int> array;指定 vector 长度为 10。vector<int> array(10);指定 vector 长度为 5,每个元素均为 0。vector<int> array(5, 0);指定 vector 中每个元素,需要 CXX11 标准vector<int> array{1, 2, 3, 4 ,5, 6};# 编译时添加 -std=c++11 选项# g++ -std=c++11 -o hello he原创 2021-03-10 15:54:08 · 565 阅读 · 0 评论 -
[C++] 堆
文章目录头文件make_heappush_heappop_heapsort_heap头文件需添加头文件#include<algorithm>make_heap建堆vector<int> arr{3, 1, 4, 6, 2, 5} // 3, 1, 4, 6, 2, 5# 大根堆make_heap(arr.begin(), arr.end()); // 6, 3, 5, 1, 2, 4# 小根堆make_heap(arr.begin(), arr.end(),原创 2021-03-09 22:12:44 · 71 阅读 · 0 评论 -
[C] strncpy 函数
strncpy 使用后,需要手动加上终止符(strcpy 和 strcat 则不需要)。char pre_left[10]strncpy(pre_left, pre + 1, left_len);pre_left[left_len] = 0;原创 2021-03-05 13:51:02 · 332 阅读 · 0 评论 -
[C/C++] 按行读取文件
数据格式整齐如果每行数据格式整齐,可以使用 C 库函数 fscanf[C] fscanfSA0010001 13:00 16:39SA0010101 07:22 22:01SA0010111 12:00 11:56代码int start_h, start_m, end_h, end_m;FILE *fp = fopen("input.txt", "r");while(!feof(fp)){ fscanf(fp, "%s %d:%d %d:%d", name, &start_h,原创 2021-03-05 09:13:38 · 3069 阅读 · 2 评论 -
[C++] 栈 和 队列
栈s.empty() 如果栈为空返回true,否则返回false s.size() 返回栈中元素的个数 s.pop() 删除栈顶元素但不返回其值 s.top() 返回栈顶的元素,但不删除该元素 s.push() 在栈顶压入新元素队列q.empty() 如果队列为空返回true,否则返回false q.s原创 2021-03-04 22:30:26 · 78 阅读 · 1 评论 -
[C] 随机数生成
#include<stdlib.h>#include<time.h>int main(){ for(int i = 0; i < 10; i++){ int x; srand(time(NULL) + 87*i); x = rand() % 100; }}原创 2021-03-04 20:15:56 · 87 阅读 · 1 评论 -
[C++] printf 打印 string 类型
string word = "hanjiale";printf("%s", word.c_str());原创 2021-03-04 11:27:57 · 9855 阅读 · 1 评论 -
[C++] map 使用场合
一对一map<string, int> mm一对多(单)map<int, vector<int>> mmmap<int, list<int>> mm一对多(双)map<int, map<int, int>> mm原创 2021-03-04 10:30:37 · 633 阅读 · 3 评论 -
[C] 从文件读取数据
input.txt 内容如下:3SA0010001 13:00 16:39SA0010101 07:22 22:01SA0010111 12:00 11:56代码int main(){ int m, start_h, start_m, end_h, end_m; FILE *fp = fopen("input.txt", "r"); fscanf(fp, "%d", &m); for(int i = 0; i < m; i++){原创 2021-03-03 20:20:41 · 139 阅读 · 1 评论 -
[C] 库函数 sprintf() 和 snprintf()
sprintf发送格式化输出到 str 所指向的字符串int sprintf(char *str, const char *format, ...)实例:char filename[50];for(int i = 0; i < 10; i++){ sprintf(filename, "frame-%d.txt", i); FILE *fp = fopen(filename, "w");}snprintf将前 n 个字符发送格式化输出到 str 所指向的字符串int snpri原创 2021-03-03 19:57:25 · 117 阅读 · 1 评论 -
[C++] map 迭代器 & 查找
迭代器正向迭代器和反向迭代器正向迭代器遍历 mapmap<string, int> mm;map<string, int>::iterator iter;for(iter = mm.begin(); iter != mm.end(); iter++){ cout << iter->first << ", " << iter->second << endl;}反向迭代器遍历 mapmap<strin原创 2021-03-03 17:35:12 · 1882 阅读 · 1 评论 -
[C++] map 存放字符串
#include<iostream>#include<map>#include<string>using namespace std;int main(){ int m; map<const char*, int> mm; FILE *fp = fopen("input.txt", "r"); fscanf(fp, "%d", &m); for(int i = 0; i < m; i++){原创 2021-03-03 16:57:58 · 2587 阅读 · 1 评论 -
[C] memset 初始化结果全为 -1
代码如下,打印结果全为 -1#include<stdio.h>#include<string.h>#define INF 0x7fffffffint main(){ int dp[10]; memset[dp, INF, 10*sizeof(int)]; for(int i = 0; i < 10; i++){ pritnf("%10d ", dp[i]); }}原因是 memset 函数是按字节赋值的,取 0x7fffffff 的低 8 位 0原创 2021-03-03 10:28:14 · 1741 阅读 · 0 评论 -
[C++] 构造函数 which is of non-class type
C++ 编译器把不带参数的构造函数优先认为是一个函数声明,然后才是对象。解决办法:不使用 () 初始化对象Darknet net;使用 {} 初始化对象Darknet net{};原创 2021-02-18 17:50:02 · 3225 阅读 · 0 评论 -
判断奇偶
if(n % 2) ✘if(n & 1) ✔原创 2020-08-18 09:59:46 · 180 阅读 · 0 评论 -
交换两个变量的值
void swap(int* a, int* b){ int tmp = *a; *a = *b; *b = tmp;}int main(){ int a = 1, b = 2; swap(&a, &b); printf("%d %d\n", a, b);}原创 2020-08-15 19:24:07 · 94 阅读 · 0 评论 -
C语言实现数组循环左移/右移
1. 最简单也是最笨的方法:每次移动一位,循环移动 k%n 次。需要移位(k%n)*n次。// n是数组元素个数,k是循环移动位数void leftMove(int A[], int n, int k){ for(int i = 0; i < k % n; i++){ int x = A[0]; for(int j = 0; j < n - 1; j++){ A[j] = A[j + 1]; }原创 2019-10-08 19:01:11 · 14582 阅读 · 5 评论 -
链接器与加载器
to do链接和加载动态库时具体做了什么?原创 2020-08-13 22:26:20 · 304 阅读 · 0 评论 -
gcc编译选项
GCC编译C源代码有四个步骤:预处理 > 编译 > 汇编 > 链接。预处理:编译器将C程序的头文件编译进来,还有宏的替换,可以用gcc的参数-E。gcc -E test.c -o test.i 生成预处理文件test.i编译:把代码翻译成汇编语言。可用gcc的参数-S。gcc -S test.i -o test.S 生成汇编文件test.S汇编:把汇编文件生成二进制目标文件。可用gcc的参数-c。gcc -c test.S -o test.o 生成目标文件test.o链接:把目标原创 2020-08-13 17:41:43 · 206 阅读 · 0 评论 -
#include““ 和 #include<>
主要是引用的路径不同#include<> 指示预处理程序到预定义的缺省路径下寻找文件。一般用于标准头文件如stdio.h。#incude"" 指示预处理程序先到当前目录下寻找文件,再到预定义的缺省路径下寻找文件。一般用于自己写的非标准头文件。...原创 2020-08-13 16:08:05 · 836 阅读 · 0 评论 -
c语言中使用相对路径
linux和windows下的c语言使用相对路径的写法不同原创 2019-11-17 23:46:56 · 3297 阅读 · 0 评论 -
fscanf函数
fscanf函数使用笔记原创 2019-11-17 23:30:59 · 261 阅读 · 0 评论 -
int f()与int f(void)的区别
int f()与int f(void)的在C语言和C++中的区别原创 2019-11-08 09:21:25 · 1712 阅读 · 0 评论 -
const与&修饰函数形参
c++中const与&修饰函数形参的四种情况转载 2019-11-06 16:47:56 · 1171 阅读 · 0 评论