c/c++
乐行僧丶
这个作者很懒,什么都没留下…
展开
-
facebook-雪花算法-分布式ID-C++实现
#include <stdint.h>#include <sys/time.h>#include <stdexcept>#include <mutex>#include <thread>#include "lightlog.h"class SnowFlake {private: static const uint64_t m_start_time_stamp = 1480166465631; // 初始时间戳 给一个随机值 st原创 2022-02-01 18:16:19 · 1177 阅读 · 0 评论 -
C++实现-带有颜色输出的简单日志类
#ifndef _LIGHT_LOG_H#define _LIGHT_LOG_H#include <iostream>#include <ostream>#include <fstream>#include <sstream>#include <string>#include <memory>#include <mutex>#include <cstdlib>namespace llog原创 2022-02-01 18:13:45 · 1297 阅读 · 1 评论 -
C++多态实现
#include <iostream>#include <functional>using namespace std;using EatPtr = function<void()>;using PlayPtr = function<void()>;struct VirtualTable { EatPtr m_eat; PlayPtr m_play;};struct Base { VirtualTable m_table; int原创 2022-01-30 11:48:54 · 886 阅读 · 0 评论 -
clang -Xclang -ast-print -fsyntax-only main.cc > main-init.cc
分析C++泛型编程的利器,生成实例化后的代码原创 2020-11-25 07:12:36 · 594 阅读 · 0 评论 -
C++11-关键字集合
原创 2020-11-22 22:54:05 · 310 阅读 · 0 评论 -
C++STL-vector实现 空间配置器
一、没有空间配置器的vector#include <iostream>#include <cstring>using namespace std;template <typename T>class vector {private: T *_first; T *_last; T *_end;public: vector(int size=10) { _first = new T[size]; _end = _first+s原创 2020-11-22 09:18:56 · 391 阅读 · 2 评论 -
C++11-forward&move&引用折叠
xx原创 2020-11-22 07:22:31 · 337 阅读 · 0 评论 -
带右值引用的拷贝构造函数和运算符重载函数
考虑一个占用堆资源类对象的拷贝构造和赋值运算符重载函数,当我们用一个临时对象去拷贝构造一个新对象或者赋值给一个已经存在的对象时,会出现一下的问题:如string类#include <iostream>#include <cstring>using namespace std;class MyString {private: char *mptr;public: MyString(const char *src = nullptr) { cout <<原创 2020-11-22 01:54:50 · 758 阅读 · 1 评论 -
C++对象的优化--减少不必要的函数调用
测试环境:win10+vs2013初始代码:#include <iostream>using namespace std;class Test {private: int ma;public: Test(int data = 10) :ma(data) { cout << "Test(int)" << endl; } Test(const Test& t) :ma(t.ma) { cout << "Test(const原创 2020-11-21 22:58:25 · 591 阅读 · 0 评论 -
C++-对象的生存周期
#include <iostream>using namespace std;class A {private: int ma;public: A(int a=20):ma(a) {cout << "A(int)" << endl;} ~A() {cout << "~A()" << endl;} A(const A& t):ma(t.ma) {cout << "A(const A&)" <<原创 2020-11-21 18:36:48 · 195 阅读 · 0 评论 -
递归逆序和正数输出正整数
正序输出#include <bits/stdc++.h>using namespace std;void print(int x) { if (x == 0) return; print(x/10); cout << x%10 << " ";}逆序输出#include <bits/stdc++.h>using namespace std;void reversePrint(int x) { if (x == 0) { retu原创 2020-11-15 16:24:14 · 630 阅读 · 0 评论 -
BF算法-串匹配算法
串的模式匹配:暴力算法,时间复杂度为O(n)。#include <bits/stdc++.h>using namespace std;// 返回第一次匹配到的位置int bf(char *s, char *t) { int i=0,j=0,k=0; while (i < strlen(s) && j < strlen(t)) { if (s[i] == t[j]) { i ++, j++; } else { j = 0; // 模式串原创 2020-11-11 10:51:08 · 172 阅读 · 0 评论 -
最长公共子序列(dp)
f[i][j]class Solution {public: int longestCommonSubsequence(string a, string b) { }};原创 2020-10-30 09:17:32 · 144 阅读 · 0 评论 -
最长回文子串
class Solution {public: string longestPalindrome(string s) { if (s.size()==1 || !s.size()) return s; if (s.size()==2 && s[0]==s[1]) return s; int n = s.siz(); vector<vector<bool>> f(n, vector<bool>(n)); // 记录子串的起始索引和长度原创 2020-10-29 07:48:54 · 127 阅读 · 0 评论 -
for循环 while循环 do while循环流程图画法
1.for(表达式1;表达式2;表达式3)2.while(条件) {循环体}3.do {循环体} while(条件)原创 2020-10-25 16:30:41 · 6338 阅读 · 0 评论 -
输出二叉树中值为x的祖先
struct node { int val; node *left, *right;};// 返回值判断二叉树中是否含有x// 含有x并且在子树中 则当前节点是一个祖先// 含有x但是就是当前节点的值 则直接返回到上一层调用bool ancestor(node *root, int x) { if (!root) return false; if (root->val == x) return true; if ((root->left && root-&g原创 2020-10-24 22:59:35 · 509 阅读 · 0 评论 -
最近公共祖先lca(C++实现)
#include <bits/stdc++.h>using namespace std;struct node { int val; node *left, *right;};node *lca(node *root, node *p, node *q) { if (!root || root==q || root==q) return root; auto left = lca(root->left, p, q); auto right = lca(root-&g原创 2020-10-24 18:38:47 · 584 阅读 · 0 评论 -
平衡二叉树(AVL)C++实现
#include <bits/stdc++.h>using namespace std;class AVL {private: struct node { int val; int height; node *left, *right; node (int x) { this->val = x; this->height = 1; this->left = this->right =原创 2020-10-09 21:40:34 · 175 阅读 · 0 评论 -
并查集(路径压缩)C++实现
class UnionFind {private: int *father; int count;public: UnionFind(int n) { this->count = n; father = new int[n]; for (int i=0; i<n; ++i) father[i] = i; } ~UnionFind(int n) { delete[] father; } // 查找索引为x的节点的父亲节点的索引 int find(int x) {原创 2020-10-07 22:16:43 · 270 阅读 · 0 评论 -
protobuf的使用(三)
rpc方法的序列化和反序列化 rpc标签在protobuf中定义描述rpc方法的类型 - service在proto文件中增加rpc服务的选项// 表示生成service服务类和rpc方法描述,默认是不生成的option cc_generic_services = true;message LoginRequest{}message LoginResponse{}message ExitRequest{}message ExitResponse{}service UserService原创 2020-05-30 11:25:29 · 447 阅读 · 0 评论 -
protobuf的使用(二)
1.定义字符串一般不使用string,使用bytes来代替string。若定义为string,proto底层还是会把string->bytes,虽然不会影响结果,但是在一定程度上还是会浪费效率。2.其他的数据类型,基本数据,列表,映射表3.为成员变量设置值test.protomessage Error { int32 errorCode = 1; bytes errorMsg = 2;}message User { bytes name = 1; int32 age = 2;原创 2020-05-30 10:35:28 · 744 阅读 · 0 评论 -
protobuf的使用(一)
一、protobuf简介protobuf (protocol buffer)是google公司实现的一种数据交换的格式,由于其是一种二进制的格式,相对于xml,json进行数据交换要快很多,且占用存储空间更小。因此可以把它用于分布式应用之间的数据通信的数据交换格式,作为一种效率和兼容性都非常优秀的二进制数据传输格式。二、protobuf的基础语法及编译命令由于protobuf独立于平台语言,Google为其提供了多种语言的实现,包括Java,C++,Go,Python等,并且为每一种实现都包含了相应语原创 2020-05-30 09:26:35 · 436 阅读 · 0 评论 -
C++关键字mutable和explicit
mutuble:使得变量可以修改,不能修饰被static和const的变量。一般在类的常方法中,尽管常方法不允许我们修改类中的任何变量,但是有时候由于实际场景的需求,还是需要对某一或某几个变量进行修改,这时候就可以使用mutable来修饰对应的变量了。explicit:禁止类构造函数进行自动隐式转换,这样可能造成歧义。1.对于单个无默认参数的构造函数适用。2.对于多个无默认值参数的构造函数不适用。3.对于多个参数的构造函数,如果第一个参数未给出默认值,而其余所有的参数都给出了默认值同样适用。.原创 2020-05-22 09:20:42 · 253 阅读 · 0 评论 -
SGI STL二级空间配置器--内存池源码剖析
一、STL容器一级空间配置器通过SGI STL vector底层源码逐步分析内存池。事实上,在我们使用STL容器时,有一点没有关心到的是我们默认使用了标准库里边的空间配置器,当然标准这样的做法是为了减少学习成本,但是当我们深入学习时,就一定要明白这些容器底层是如何工作,才能注重效率,才能用好STL容器。正如侯捷先生所说"源码之后,了无秘密。", 下面通过vector容器先看一级空间配置器:...原创 2020-02-11 13:09:24 · 330 阅读 · 0 评论 -
C++空间配置器
空间配置器的作用:(1)将对象构造和内存开辟进行分离。(2)将对象析构和内存释放进行分离。空间配置器的主要函数:1.allocate:进行内存的开辟,底层调用的就是malloc。2.deallocate:进行内存的释放,底层调用的就是free。3.construct :使用定位new来负责给容器中的对象进行构造。4.destroy:负责析构容器中的对象。p->~T()。 空间...原创 2020-02-11 12:11:40 · 286 阅读 · 0 评论 -
C++中的new有几种?
1.普通new形式:int* p = new int;此时不能通过p是否为nullptr来判断内存是否开辟成功,而是需要通过bad_alloc来捕获异常。2.(nothrow) new形式:int *p = new (nothrow) int(20);此时指针已经退化为C语言中通过malloc开辟内存得到的指针,是可以通过判空来验证是否成功开辟内存。3.申请指向常量内存的指针的new...原创 2020-01-25 09:51:17 · 894 阅读 · 1 评论 -
2019春招 CVTE C/C++开发岗笔试编程题两道
一、题目描述请编写一个函数用于判断输入的int是否是-2的整数次幂加1 eg((-2)^N+1)测试用例:1 2 1205 -7输出正确10 -9输出错误代码实现:bool isPowerOfNegativePlusOne(int numbser){ if(n &amp;amp;amp;lt; 0){ n -= 1; n = -n; } else{ n -= 1; } if(n ...原创 2019-02-21 21:55:02 · 11287 阅读 · 0 评论 -
数组指针和指针数组
一、数组指针 初学C语言的朋友对数组指针这指针数组感到迷惑,分不清,包括我自己,其实是对概念的不清晰以及对数组和指针这两个概念理解的不够深入,下面谈谈我的理解。 数组指针,是一个指针而不是数组。 这个指针具有指向整个数组的能力,保存这个数组的其实地址。 定义数组指针变量1.先定义数组类型,根据类型定义指针变量typedef int A[5];//A是数组类型。元素类型为int,元素个...原创 2018-08-21 20:32:50 · 279 阅读 · 0 评论 -
c++函数重载概念及重载规则
函数重载概念:用一个函数名定义不同的函数,当函数名和不同的参数搭配是函数的含义不同。重载规则: 1.函数名需相同。 2.参数的个数、参数的顺序和参数的类型不同均可构成重载。 3.在同一作用域 4.返回值类型不同不能构成重载。int fun(int a,int b); //可以int fun(float a,float b); //可以int fun(char a,char b...原创 2018-05-06 13:19:14 · 6569 阅读 · 5 评论 -
泛型算法:堆算法
堆算法是泛型算法的一种,通过迭代器搭建泛型算法与容器联系的桥梁。堆算法支持的四个操作:make_heap(),push_heap(),pop_heap()和sort_heap()。注意:迭代器必须使用支持随机访问的迭代器容器类,否则不能使用该算法。(1)make_heap在[fisrt,last)左闭右开的区间构建一个堆。#include <vector>#includ...原创 2019-01-06 16:01:10 · 286 阅读 · 2 评论 -
C++11新特性--lambda表达式
在C++11以后,形如这样的语法。[capture](parameters)mutable -&gt;return-type{statment}称为一个lambda表达式,表达一个匿名函数。从编程的角度上看,lambda是一种函数式编程。分析语法:1.capture,可以通过值传递或者引用传递的方式给匿名函数提供访问父作用域上下文的变量。特殊的两种情况:[=]和[&amp;]分别表示,以值传...原创 2018-12-31 10:52:49 · 308 阅读 · 0 评论 -
C++11新特性--智能指针
为什么会有智能指针???C++程序员在编写代码的过程往往都会涉及到堆内存的开辟和释放,使用new和delete关键字。特别是内存的释放是通过程序员手动完成的,而不像栈内存只要生存周期结束即可由系统自动回收。所在在实际的编码中,如果忘记手动释放内存或因其他一些细节原因而未进行堆内存的释放,最终导致产生大量的内存释放,造成资源浪费。一些特殊的情况导致堆内存没有机会得到释放int main(){...原创 2018-12-02 12:10:20 · 527 阅读 · 0 评论 -
c和c++的区别(二)const和引用、一级指针、二级指针的结合
一、const和一级指针的结合一级指针的模型 一级指针可以有两种表达方式,p和*p。所以const与一级指针有两种结合方式。//在c++语法规则中,const修饰距离它最近的类型。int a=10;int *p=&amp;amp;amp;a;int const *p;//距离const最近的类型是int,而不是int*,因为int已经是类型了//const的是*p,p本身没有被const修...原创 2018-08-04 09:07:20 · 703 阅读 · 0 评论 -
volatile关键字的使用
MSDN手册中对volatile关键字的解释: 大概的翻译: volatile关键字是一个类型限定符,用于声明一个对象可以通过其他语句(例如操作系统、硬件或并发执行的线程)在程序中进行修改。 volatile关键字的两个功能: (1)防止编译器对汇编指令做顺序上的优化。 (2)防止寄存器存储变量的副本值。 应用在多线程中int gdata=10;//全局变量int ...原创 2018-08-04 00:10:31 · 311 阅读 · 0 评论 -
C语言中的强符号和弱符号
一、强弱符号强弱符号针对的是处于同一工程下在不同源文件下定义的全局变量符号,链接器只处理global的符号而不处理local的符号。链接的核心是符号的重定位,在符号引用的地方找到符号定义的地方,包括函数产生的符号和全局变量产生的符号。强符号:函数和初始化的全局变量所生成的符号。 弱符号:未初始化的全局变量所生成的符号。很多情况下写出的代码会出现链接的错误,符号重定义,这是因为在不同的...原创 2018-07-29 09:30:10 · 1917 阅读 · 1 评论 -
深入理解编译、链接和运行(obj文件组成格式分析,可执行文件组成格式分析)
一、简单的CS历史 现代大多数计算机都是基于冯.诺伊曼提出的存储程序原理采用冯.诺伊曼架构,即由运算器、控制器、存储器和输入输出设备组成。为了屏蔽I/O设备的底层差异,产生虚拟文件系统virtual file system(VFS)。为了屏蔽内存和I/O的差异产生了虚拟存储器(虚拟内存),而为了屏蔽CPU、I/O和内存的差异进而产生进程的概念。虚拟的概念是由大名鼎鼎的计算机公司IBM提出...原创 2018-07-28 17:29:41 · 8141 阅读 · 2 评论 -
c和c++的区别 (一)函数默认值、内联函数、函数的重载和c/c++之间的相互调用
一.函数默认值 c++支持给函数的形式参数进行默认初始化,其规则为从右向左依此初始化。还有以下需要注意的几点: 1.定义处可以不给出形参的默认值,在声明处可以给出形参的默认值。 2.声明处形参默认值给出要符合以上规则。 3.不能重复给形参默认值进行初始化,即一个形式参数只能初始化一次。#include&amp;lt;iostream&amp;gt;using namespace std;//...原创 2018-06-24 11:30:54 · 319 阅读 · 0 评论 -
图示构造函数的析构顺序(默认构造函数、拷贝构造函数和赋值运算符重载函数)
示例代码:#include<iostream>using namespace std;class Test{public: Test(int a=10,int b=20) { _a = a; _b = b; cout << this << " "; cout <...原创 2018-05-29 17:42:40 · 474 阅读 · 0 评论 -
C和C++中经const修饰的常量、常变量和普通变量的区别
1.在C89标准下的constconst 修饰的类型是一个常变量,不能作为数组的下标。常变量不能作为左值。如:const int a = 10;int b = a;//其编译的过程和一般变量编译的过程相同//并不会把引用符号的地方替换为对应的数据2.C++99(1)常量:在c++中,const int a = 10是一个真真正正的常量。 (2)常变量:退化为常变量的情况...原创 2018-05-12 14:23:53 · 2026 阅读 · 0 评论 -
字符串匹配算法 -- 朴素匹配
何为匹配? 就是在一个串中寻找是否和有何目标串相同的真字串。为什么叫做朴素匹配,我理解的就是这是一种寻常想法,简单粗暴的算法。是一种暴力的算法,不考虑其时间复杂度以及效率。只要达到匹配的目的即可。代码实现:#include<stdio.h>#include<string.h>static int PuSu(const char* s,const cha...原创 2018-05-18 16:10:25 · 482 阅读 · 0 评论