C++
文章平均质量分 55
彭同学她同桌
这个作者很懒,什么都没留下…
展开
-
C++-proto文件
灵活高效的结构化数据存储格式 方便序列化 适合做RPC的数据交换。Repeated类型的字段有一些特殊的方法。消息的协议文件 应该是protobuf。optional 表示可选字段。repeated 表示重复字段。使用index来获取特定的字段。reqired 表示必选字段。_size:检查有多少个字段。add_方法添加一个新的字段。更新一个已经存在的字段。原创 2022-09-26 10:07:40 · 693 阅读 · 0 评论 -
C++-JSON
是一种传递对象的语法 对象可以是name/vvalue对,数组和其他对象数组(Array)用方括号(“[]”)表示。对象(0bject)用大括号(“{}”)表示。可以看作一个容器名称/值对(name/value)组合成数组和对象。名称(name)置于双引号中,值(value)有字符串、数值、布尔值、null、对象和数组。并列的数据之间用逗号(“,”)分隔 名称和值也用逗号(“,”)隔开。............原创 2022-08-16 16:04:27 · 431 阅读 · 0 评论 -
C++-宏
;+=){()}可变参数的宏只支持字符串 不支持可变参数或者多个参数不能有变量。原创 2022-08-09 19:58:38 · 102 阅读 · 0 评论 -
C++-数据类型
size_tsize_typestddef.h中定义size_t 类型表示C中任何对象所能达到的最大长度,它是无符号整数在32位中为 unsigned int 64位中位unsignd longsize_t 的目的是提供一种可移植的方法来声明与系统中可寻址的内存区域一致的长度size_t作为sizeof()操作符的返回值malloc 和strlen函数的参数类型用%d输出时表示将size_t当作有符号整数输出用%zu输出表示将size_t当做无符号整数输出size_t a= -5pr原创 2022-05-27 15:56:52 · 147 阅读 · 0 评论 -
C++-list
链式存储 非连续空间 动态存储分配用法创建list<int> b(2,3);//将2个3拷贝给alist<int> a(b.begin(),b.end());list<int> c(a);插入和删除数据push_back() 插入到最后push_front() 插入到最前pop_back() 删除最后一个pop_front() 删除最前remove(elem)//删除容器中全部与elem相同的元素insert()a.insert(a.begin原创 2022-05-13 14:38:17 · 111 阅读 · 0 评论 -
c++-printf详解
printf返回值int printf ( "格式化字符串",输出表列);//原型正确返回输出的字符总数,错误返回负值,与此同时,输入输出流错误标志将被置值,可由指示器ferror来检查输入输出流的错误标志。int aa = printf("/132:%c\n", '\132');//返回的是字符总数7printf输出类型%的%[标志][最小宽度][.精度][类型长度]类型而关于转义字符有两个特殊的-+号的printf("/132:%c\n", '\132');//输出的是原创 2021-11-01 17:43:00 · 13125 阅读 · 0 评论 -
c++-友元
如何使用友元函数最简单的使用class A{ int val; int id;public: A(int a, int b) { val = a; id = b; } friend void func(const A a);};void func(const A a)//原本这个函数时不能访问a的val 因为val是私有成员变量 但是作为友元之后就可以访问了{ cout << a.val;}原创 2021-09-14 11:38:31 · 85 阅读 · 0 评论 -
c++-关键字
final类不能继承虚函数不能被重写原创 2021-09-13 16:32:37 · 99 阅读 · 0 评论 -
c++-散列表(哈希表)
什么是散列表是一种数据结构 他主要是将键值 通过一个哈希函数 映射到表中的一个位置实现快速查找 哈希函数: 例如 键值%17 = 表中的下标位置 键值2004 通过哈希函数后2007%17 就会得到表中下标的位置 这就是哈希表映射的方法 但是很明显这个值是会重复的 就产生了哈希冲突如何解决哈希冲突链表式解决就用链表的方法 当发生冲突的时候就放到next的位置开放地址线性探测就是如果重复了发生了冲突 就往后一格放结果就是这样那么最开始15%13 是2 2是空的就放在2那原创 2021-09-09 19:54:15 · 337 阅读 · 0 评论 -
c++-值传递与引用传递在返回值和形参中
x.a = 1;y.a = 2;形参值传递 返回值值传递A func1(A b){ cout << "调用了func" << endl; return b; //隐藏了 A z = b;y = z;}y = func1(x);结果调用func1:参数值传递 返回值值传递------------------------------------------------------调用了拷贝构造函数 //创建一个形参b 将变量x拷贝给形参b原创 2021-09-07 17:46:49 · 201 阅读 · 0 评论 -
c++-extern
变量声明告诉程序变量的名字和类型 可以声明多次变量定义变量定义主要是为变量分配存储空间还可以初始化 只能定义一次extern变量只是对变量进行声明 不进行定义 就是告诉程序有这个变量如果既使用extern 又初始化定义 那就是定义 不是声明了extern int a = 10;只要不加extern的都算作定义 无论有没有初始化函数相较于将函数声明放在头文件再包含头文件的方法 可以直接使用extern void func();就不需要包含相应的头文件了这样做的优点就是简明而且会加速原创 2021-08-30 15:12:21 · 102 阅读 · 0 评论 -
c++-随机数
最常规#include <iostream>#include <ctime>using namespace std;int main(){ srand(unsigned(time(0))); int count = rand() % 3 + 1; //范围1~3 //rand()//最大范围只有32767 return 0;}mt19937 (茅台19937)#include <random>using namespace std;ra原创 2021-08-30 10:38:15 · 112 阅读 · 0 评论 -
C++-对象池
首先我们知道class Node{ public: //struct Obj { Obj* next; }; int a;//4 char b;//1};他的内存大小是8 如果此时添加 struct Obj { Obj* next; };也就是把那个注释取消会发现还是八个字节 并没有多占用内存对象池是什么就是提前分配好例如一千个类对象 然后在需要的时候从这一千个对象中分配对象出去定义对象池的目的是什么一个是防止内存碎片化 直接分配一块足够大的内存原创 2021-08-09 21:10:57 · 379 阅读 · 0 评论 -
C++-deque
deque双端数组 可以再队头和队尾进行删除和插入操作 底层是动态分段空间是一小段动态连续内存空间+多个缓存区构成 每个缓存区用来存放数据 而动态连续内存空间是用来存放缓存区的地址的 这样就方便找到缓存区 他能在队头增加删除的原因就在于是分段的 类似于链表和数组的结合体就类似于这样 中控区就是那段连续的地址空间 而缓冲区的地址就保存在中控区中这也是为什么迭代器可以直接q.begin()或者q.end()的原因 cur就是当前指向这个缓冲区的第几个 而node表示是第几个缓冲区 所以他相较于ve原创 2021-08-09 15:11:28 · 55 阅读 · 0 评论 -
C++-二分查找库函数
#include<iostream>#include<algorithm>using namespace std;int main(){ int a[100]= {4,10,11,30,69,70,96,100}; int b=binary_search(a,a+9,4);//查找成功,返回1 cout<<"在数组中查找元素4,结果为:"<<b<<endl; int c=binary_search(a,a+9原创 2021-08-06 11:15:55 · 1038 阅读 · 0 评论 -
C++-强制转换
static_castdynamic_castconst_castreinterpert_cast要看的原创 2021-08-06 11:03:15 · 69 阅读 · 0 评论 -
C++-int最大值
-2147483647 原码1111 1111 1111 1111 1111 1111 1111 1111-2147483647-1=-2147483648;由于cpu里面存的是补码计算-2147483647 补码1000 0000 0000 0000 0000 0000 0000 0001-1 补码1111 1111 1111 1111 1111 1111 1111 1111得到-2147483648 补码1000 0000 0000 0000 0000 0000 00原创 2021-08-03 11:39:15 · 3858 阅读 · 0 评论 -
C++-面试
C++11新特性auto decltype 就是可以自动推到变量或者数据类型 auto会自动被释放 栈区auto和decltype区别在于auto一定要初始化 并且表达式的值就是初始化的值 而decltype就无关lambda表达式就是类似于一个匿名函数 可以有引用传递 值传递 混合传递 优点就在于定义完就立刻运行 而且在要使用的地方可以立刻定义 方便更改 一般配合auto 形成函数指针使用 如果用引用可能会造成悬挂引用 就是在引用前这个对象就被销毁了 造成指向被清理的内存空间右值引用 &原创 2021-07-21 21:56:17 · 398 阅读 · 0 评论 -
C++-queue
#include<queue>普通队列queuetop() 访问队头元素empty() 队列是否为空size() 返回队列内元素个数push(int i) 插入元素到队尾 (并排序)emplace(int i) 原地构造一个元素并插入队列pop() 弹出队头元素swap() 交换内容 //还不知道怎么用优先队列priority_queue相较于普通队列 优先队列会自动进行排序大顶堆就是从top()取值的时候 是这个队列的最大值 也就是从小到大排默认为大顶堆 prior原创 2021-07-15 10:10:32 · 123 阅读 · 0 评论 -
C++-内联函数
内联函数使用方法一般内联函数定义在头文件中 因为编译器需要找到该内联函数的定义才能进行内联 所以如果放在cpp文件中 你就需要在每一个需要使用该内联函数的文件中定义一次内联函数 多个文件中定义完全一样的内联函数不会有问题inline int max(int a, int b){ printf("内联函数");}//inline必须和定义在一起 不能和声明在一起 下面这样是不行的inline void A(); void A() // inline 与函数定义体放在一起{ ...}原创 2021-07-12 17:20:44 · 180 阅读 · 0 评论 -
C++-内置函数
lower_bound(begin,end,num)和upper_bound(begin,end,num)头文件 #include<algorithm>lower_bound是从数组的begin位置到end-1位置二分查找第一个大于或等于num的数字upper_bound则是大于lower_bound( )和upper_bound( )都是利用二分查找的方法在一个排好序的数组中进行查找重载该函数 从找第一个大于的变成找第一个小于的int cmd(int a,int b){ retu原创 2021-07-11 10:34:19 · 63 阅读 · 0 评论 -
C++-cctype库
头文件#include///*isalpha判断是否是字母 如果是一个字母就返回一个非0整数 如果不是一个字母就返回0*//*实际上就是类似于 if((ch >= 'a'&&ch<='z')||(ch >= 'A' && ch <= 'Z'))*///char a = 's';//int b = isalpha(a);//返回2 //char c = ',';//b = isalpha(c);//返回0//char f = '2'原创 2021-07-10 08:50:13 · 82 阅读 · 0 评论 -
C++-从cpp文件到exe文件的过程
分为四个过程预处理编译汇编链接什么是.i文件(预处理后文件)预处理器执行宏替换、条件编译以及包含指定的文件。什么是.s文件(汇编文件)大概就是.i文件通过机器翻译得到的文件什么是.o文件(可重定位目标文件(机器码文件))由汇编文件经过汇编操作生成,该文件不可直接执行什么是.out文件(二进制可执行目标文件(也是一个目标文件))由机器码文件进一步链接生成。这一步中,各种符号引用和符号定义转换成为可执行文件中的合适信息,通常是虚拟地址。预处理源文件和头文件被预处理成一个 .i文件原创 2021-07-02 16:51:15 · 3701 阅读 · 0 评论 -
C++-lambda表达式
lambda表达式[]标识符 表示一个Lambda的开始 必须存在 不能省略()参数{}实现体lambda表达式作用是什么用于定义并创建匿名的函数对象例子最简单的使用 lambda表达式会自动判断返回值末尾的(9)会被赋值在(int x)的x上 所以输出9[](int x) {cout << x << endl;return 0 } (9);//9用自动类型 也就是函数指针接收这个lambda表达式这样就可以简单实现函数 不需要再顶部重新定义一个 au原创 2021-07-01 16:43:02 · 342 阅读 · 0 评论 -
function详解 c++
function博客转载 2021-07-01 15:55:24 · 832 阅读 · 0 评论 -
C++-auto
auto原理auto的原理就是根据后面的值,来自己推测前面的类型是什么。auto的作用域auto变量在离开作用域是会变程序自动释放,不会发生内存溢出情况(除了包含指针的类)。使用auto变量的优势是不需要考虑去变量是否被释放,比较安全。...原创 2021-07-01 15:26:15 · 135 阅读 · 0 评论 -
for (auto count : b)
for (auto count : b)char a[] = { '1','2','3','5','2','0' }; vector<char>b(a, a + 6); for (auto count : b)//就是用来遍历的 cout << count << " ";原创 2021-07-01 15:04:04 · 113 阅读 · 0 评论 -
C++-左值与右值
左值什么是左值左值就是放在赋值号(=等号这种)左边的值 也就意味着左值是可以被赋值 被修改的 要不然放在等号左边干嘛呢 所以const变量是肯定不能放左值的int a;a = 2;//a就作为左值 2是右值int * b;b = a;//此时b指针是左值 a变量就作为了右值右值什么是右值左值就是放在赋值号(=等号这种)右边的值 同样意味着这个值可以是不能被赋值或者改变的 一般常量或者变量都可以作为右值重点 右值引用......原创 2021-06-28 11:08:13 · 197 阅读 · 0 评论 -
C++-cout原理
char* f1(){cout << "a" ; return "1";}char* f2(){cout << "b" ; return "1";}char* f3(){cout << "c" ; return "1";}int main(){cout << "m" << f1() << f2() << f3() << endl;return 0;}//结果是cbam111原创 2021-06-28 11:08:01 · 257 阅读 · 0 评论 -
C++-迭代器
什么是迭代器迭代器不是指针 是类模板 表现的像个指针 重载了指针的一些操作符,->、*、++、–是一个“可遍历STL( Standard Template Library)容器内全部或部分元素”的对象 好像比指针更好用为什么要有迭代器迭代器产生原因Iterator类的访问方式就是把不同集合类的访问逻辑抽象出来,使得不用暴露集合内部的结构而达到循环遍历集合的效果。...原创 2021-06-27 12:43:15 · 106 阅读 · 0 评论 -
C++-set
头文件< set >元素在插入时自动排序set不允许有重复元素插入 set<int> a; a.insert(10); a.insert(120); a.insert(60); a.insert(60); a.insert(40); /*拷贝构造*/ set<int>b(a); /*赋值*/ set<int>c; c = b; for (set<int>::iterator it = c.begin(); it !=原创 2021-06-24 17:30:49 · 479 阅读 · 0 评论 -
C++pair
头文件< utility >什么是pairpair是将2个数据组合成一组数据的一个结构体操作/*先创建再赋值*/ pair<int, int> a; a = make_pair(1, 2); a = pair<int, int>(2, 3); /*直接初始化*/ pair<int, int>b(1, 3); /*拷贝*/ pair<int, int>c(a); c = b; cout << "第一个元素:"原创 2021-06-24 15:43:27 · 70 阅读 · 0 评论 -
C++-const
const类成员函数声明一个const类型的类成员函数,只需要在成员函数参数列表后加上关键字const只有被声明为const的成员函数才能被一个const类对象调用class A{public: void fun1 const; void fun const { }};void A::fun1 const{}const重载如果是类的成员函数就运行重载class A{public: void fun() { cout << "fun1"原创 2021-06-17 17:30:59 · 99 阅读 · 0 评论 -
C++-指针和数组
函数指针本质是指针 指向一个函数函数的定义是存在于代码段,因此,每个函数在代码段中,也有着自己的入口地址函数指针就是指向这个入口地址例子int fun(int b){ return b;}void main(){ int b = 5; int(*a)(int) ; a = fun; cout<<a(b);}void fun(){ cout << "fun" << endl;}void main(){ void(*a)()原创 2021-06-17 16:42:11 · 107 阅读 · 0 评论 -
C++-智能指针
什么是智能指针特点智能指针会负责自动释放所指向的对象种类共享指针shared_ptr生命周期shader_ptr在fun1中创建 传入了fun2 然后多线程调用指向了fun3 fun4 fun5 只有在所有fun执行完 也就是最后一个fun结束shader_ptr才会被销毁用法unique_ptr能用的 shader_ptr都能用 只是把unique_ptr换成shader_ptr不同的是 shared_ptr<int> p2 = p1; //use_count原创 2021-06-16 17:18:08 · 1187 阅读 · 8 评论 -
C++-cast
dynamic_cast将一个指向基类的指针转换成指向派生类的指针;如果失败,返回空指针。能够在类层次中进行向上转换这个是将基类指针转换为子类指针 但是基类一定要有虚函数 要不然会报错class Base{public: virtual void f() { cout << "Base's f()" << endl; }};// 我是子类class Son : public Base{public: void f() { cout << "S原创 2021-06-13 13:41:15 · 257 阅读 · 0 评论 -
C++-资源释放和申请
什么是资源释放释放一个内存地址并不是把这块地址的值置为0 而是将这块地址设为未使用原创 2021-06-12 16:41:09 · 263 阅读 · 0 评论 -
C++-静态
静态静态存储区在整个程序运行期间一直存在静态变量static 全局变量 常量未经初始化的静态变量自动初始化为0静态变量静态变量和其他变量的区别在于 静态变量作用周期结束后并不会被销毁 而是存在内存中静态函数函数的实现使用static修饰,那么这个函数只可在本cpp内使用,不会同其他cpp中的同名函数引起冲突类的静态成员可以实现多个对象之间的数据共享 就是多个对象都使用的是同一个类成员变量 所有该类的这个静态成员变量只有一个 供所有对象使用类的静态函数该函数就不再属于类的对象 而是属原创 2021-06-12 16:15:09 · 735 阅读 · 0 评论 -
C++map
map<int ,int> m对key值会进行排序map中所有元素都是pair 对值map不允许有重复的keymutimap允许有重复的keymap遍历输出for(map<int ,int>::iterator it = m.begin());it!=m,end();it++){ cout<<"key = "<<(*it).fitst<<"value = "it->second<<endl;}size()返回原创 2021-03-29 16:14:24 · 169 阅读 · 0 评论 -
C++-vector
与数组类似 但是他是动态扩展的动态扩展并不是再原空间之后 续接新空间 而是找到一块更大的连续内存空间 然后将原数据拷贝过去在尾部插入和删除构造函数vector v默认构造函数 T是该vector的类型 v是对象名vector(v.begin(),v.end());将v[begin(),end())区间中的元素拷贝给本身vector(n,elem)将n个elem数拷贝给本身 例如vector(10,2)就是将是个二复制给vector迭代器iteratorfor(vector<in原创 2021-03-22 17:26:57 · 493 阅读 · 0 评论