![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
才不是本人
修身,穷理,有趣
展开
-
shared_ptr的坑
shared_ptr 原理及事故new与赋值的坑赋值(assignment)和new运算符在C++与Java(或C#)中的行为有本质的区别。在Java中,new是对象的构造,而赋值运算是引用的传递;而在C++中,赋值运算符意味着"构造",或者"值的拷贝",new运算符意味着在堆上分配内存空间,并将这块内存的管理权(责任)交给用户。C++中的不少坑,就是由new和赋值引起的。在C++中使用new的原因除了堆上能定义体积更大的数据结构之外,就是能使用C++中的dynamic dispatch(也叫多态).转载 2020-09-26 17:21:45 · 1997 阅读 · 0 评论 -
c++使用proto3的map
Introduction:自proto3开始, proto2和proto3就可以支持map.##官方文档中有如下声明:##Added support for map fields (implemented in both proto2 and proto3).Map fields can be declared using the following syntax:>message Foo { map<string, string> values = 1;}The da原创 2020-07-03 17:19:44 · 11257 阅读 · 3 评论 -
C++ 有哪些奇淫巧技之仿函数
一、理论:二、仿函数应用场景:三、仿函数的实现一、理论:1.C++仿函数本质上是一个类,而不是一个函数. 2.其实现方式是对class的()操作符重载,让其拥有类似于函数的功能二、仿函数应用场景:若需要对一个vector&amp;lt;`string&amp;gt;进行字符串长度小于10的计数,你的代码可能是这样的: 幼年期:bool cmp(co...原创 2018-06-20 11:05:49 · 501 阅读 · 0 评论 -
c++模板 map的value排序
如需转载请注明出处#include &amp;amp;amp;amp;amp;lt;map&amp;amp;amp;amp;amp;gt;#include &amp;amp;amp;amp;amp;lt;iostream&amp;amp;amp;amp;amp;gt;#include &amp;amp;amp;amp;amp;lt;algorithm&amp;amp;amp;amp;amp;gt;#in原创 2018-07-23 18:20:29 · 378 阅读 · 0 评论 -
单链表前插法
###其实根本没有什么前插法,这是一个坑!!!因为获取不到前一个结点的next指针,故,实现方法为:向当前结点后面插入一个新的结点,交换两个结点的值c++代码实现如下:template &amp;amp;amp;amp;amp;lt; typename T&amp;amp;amp;amp;amp;gt;class Node{ public: void insert(Node* s, T data); ~Node(); p原创 2018-11-15 15:23:18 · 1846 阅读 · 0 评论 -
归并排序c++实现
void merge(int arr[], int left, int mid, int right){ std::vector<int> *result = new std::vector<int>(); int l = left; int m = mid;// std::cout <<"[";// for(int i ...原创 2018-11-22 00:04:11 · 2452 阅读 · 0 评论 -
static_cast、dynamic_cast、const_cast与reinterpret_cast
强制类型转换区别于隐式的类型转换如://数组转指针类型int ia[10];int* ip = ia;//指针转bool类型char *cp = get_string();if(cp)//类类型定义的转换string s, t=&quot;a value&quot;;有时我们需要显示地将对象强制转换成另外一种类型.这种方法称作强制类型转换(cast),形式如下:cast-name(expres...原创 2018-11-28 18:08:51 · 343 阅读 · 0 评论 -
c++ 单链表模板类
/** * * File Name: LinkedList.hpp * brief:单链表 * author:Patrick * Create Time: 2019年01月16日 17:49:56 * */#pragma once#include <iostream>#include <sstream>using namespace s...原创 2019-01-17 13:01:34 · 610 阅读 · 0 评论 -
c++的内存优化
本文目的:1.了解什么是内存2.内存优化有哪些方式3.怎样做内存优化概述:我们常常在开发场景下提及的内存是指程序内存.程序内存可以分为以下五种:1、 栈区(stack):栈的空间是连续的, 先进后出能保证不会产生内存碎片, 由高地址向低地址生长, 编译器自动分配和释放, 用来存放函数的参数值,局部变量的值等。操作方式类似于数据结构中的栈。栈用于维护函数调用的上下文,离开了栈函数调...原创 2019-01-18 17:43:33 · 5491 阅读 · 0 评论 -
快速排序 C++实现
代码:#include<iostream>using namespace std;void quick_sort(int arr[], int32_t left, int32_t right){ int32_t l = left; int32_t r = right; int flag = arr[l]; if(left < right)...原创 2019-01-09 18:40:31 · 6290 阅读 · 2 评论 -
如何编写CMakeLists
文章目录[Preface]一.项目根目录二.根目录的CMakeLists.txt三.子编译目录src/CMakeLists.txt附录.源代码[Preface]构建一个工程的时候,CMake需要知道的几个点(如果下面几件事你知道怎么做了,多大的工程就都不是问题了)A.源代码在哪里?B.头文件在哪里?C.怎么生成静态或者动态库?D.程序链接的静态库在哪里?E.如果工程的代码存放在很多地...原创 2019-01-16 15:52:13 · 3707 阅读 · 0 评论 -
std::move与std::forward
Purposes:理解引用折叠理解完美转发std::move()与std::forward区别Premise:左值、左值引用、右值、右值引用左值:Summary:Appendix:原创 2019-01-22 17:21:38 · 956 阅读 · 0 评论 -
循环数组实现循环队列 c++
Premise:一开始想在网上找个栗子, 随便改改就行, 但是都如出一辙, 不是本人想要的于是自己动手写了一个.Code:const uint8_t MAXCMDLENTH = 255;class RecycleQueue{public: RecycleQueue() { container = new int[MAXCMDLENTH]; left = 0; righ...原创 2019-02-21 15:23:08 · 1660 阅读 · 0 评论 -
warning: ‘void* memset(void*, int, size_t)’ clearing an object of non-trivial type
Premise:当更新gcc版本到8.1以上的时候, 会出现如Title一样的错误。Resolution:- memset(&tcparams, 0, sizeof(tcparams));+memset(static_cast<void*>(&tcparams), 0, sizeof(tcparams));Quote:Link...原创 2019-08-20 16:47:32 · 4741 阅读 · 0 评论 -
c++右值引用
1. 左值和右值2. 右值引用和左值引用3.std::forward与std::move4.C++测试代码1. 左值和右值(1)两者区别: ①左值:能对表达式取地址、或具名对象/变量。一般指表达式结束后依然存在的持久对象。 ②右值:不能对表达式取地址,或匿名对象。一般指表达式结束就不再存在的临时对象。 (2)右值的分类 ①将亡...原创 2018-05-28 18:36:49 · 306 阅读 · 0 评论 -
C++代码实现 生成器模式
附一个编译当前目录下所有CPP文件的MakeFile生成器模式产品设计生产分配生成器模式生成器模式(Builder)不同于工厂模式(Factory): 生成器模式是通过一个生成器(Builder)生产出不同类型的产品,即通过设计出一个产品的每个部件(Builder的具体实现,如Dell_Builder),经过生产(Product)和组装(Di...原创 2018-04-28 10:37:43 · 4131 阅读 · 1 评论 -
c++ 桥接模式(进阶版)
写本文理由:桥接模式:运行结果:总结:写本文理由: 加深对设计模式的理解 本文重点在C++实现桥接模式: [图片来自《设计模式可复用面向对象软件基础》一书(c++)] Abstraction.hpp#pragma once ...原创 2018-05-17 16:28:06 · 267 阅读 · 0 评论 -
c++实现子线程循环 10 次,接着主线程循环 100 次,接着又回到子线程循环 10 次,接着再回到主线程又循环 100 次,如此循环50次
准确的说这是在别人代码上修改的,虽说这种实现方法可以实现题意。但是总感觉还有更好的方法,如果读者有更好的方法欢迎留言,如果读完本文有所收获也可以留言,大家一起分享。#include <stdio.h> #include <process.h> #include <windows.h> HANDLE g_hThreadEvent1;HANDLE g_hThreadEvent2;in原创 2017-09-05 14:54:19 · 2007 阅读 · 0 评论 -
malloc,calloc,realloc,memset之间的关系
阅读下面文章可以同时参考C运行时库(C run-time library) 1.首先要了解的是:堆栈区(stack):由编译器自动分配与释放,存放函数的参数值,局部变量,临时变量等等,它们获取的方式都是由编译器自动执行的堆区(heap):一般由程序员分配与释放,基程序员不释放,程序结束时可能由操作系统回收(C/C++没有此等回收机制,Java/C#有),注意它与数据结构中的堆是两回事,分配方式原创 2017-09-14 11:38:23 · 496 阅读 · 0 评论 -
c++多线程重点难点(三)Mutex
互斥量互斥量是一个内核对象,它用来确保一个线程独占一个资源的访问。互斥量与关键段的行为非常相似,并且互斥量可以用于不同进程中的线程互斥访问资源。使用互斥量Mutex主要将用到四个函数创建互斥量:CreateMutex 函数返回一个互斥量的句柄或者NULL打开互斥量:OpenMutex 函数返回一个互斥量的句柄或者NULL触发互斥量:ReleaseMutex 访问互斥资源前应该要调用等待函数,结原创 2017-09-07 14:04:24 · 564 阅读 · 1 评论 -
c++多线程重点难点(四)semaphore
信号量可以实现线程间的同步,使用非常广泛信号量常用的三个函数: 创建信号量:CreateSemaphore 开启信号量:OpenSemaphore 增加信号量:ReleaseSemaphore 由于信号量是内核对象,因此使用CloseHandle()就可以完成清理与销毁了。信号量的实现代码:#include <stdio.h>#include <process.h>#include <w原创 2017-09-07 14:32:56 · 641 阅读 · 0 评论 -
c++多线程重点难点(一)interlocked系列原子操作
CreateThread与_beginthreadex的本质区别,interlocked系列函数实现原子操作原创 2017-09-06 17:08:06 · 1909 阅读 · 0 评论 -
priority_queue优先级队列
priority_queue 优先级队列是一个拥有权值概念的单向队列queue,在这个队列中,所有元素是按优先级排列的。在计算机操作系统中,优先级队列的使用是相当频繁的,进线程调度都会用到。在STL的具体实现中,priority_queue也是以别的容器作为底部结构,再根据堆的处理规则来调整元素之间的位置。template , class Compare= less > cl原创 2017-09-15 16:08:55 · 383 阅读 · 0 评论 -
c++多线程重点难点(五)Event
1.事件是内核对象,事件分为手动置位事件和自动置位事件。事件Event内部它包含一个使用计数(所有内核对象都有),一个布尔值表示是手动置位事件还是自动置位事件,另一个布尔值用来表示事件有无触发。 (1).对于手动置位事件,所有正处于等待状态下线程都变成可调度状态。 (2).对于自动置位事件,所有正处于等待状态下线程只有一个变成可调度状态。 2.事件可以由SetEvent()来触发,由原创 2017-09-11 10:22:36 · 462 阅读 · 0 评论 -
基于KMP算法的路径下文本查询程序的c++实现2.0版
#undef UNICODE#include<iostream>#include<string>#include<set>#include<map>#include<vector>#include<fstream>#include<sstream>#include<algorithm>#include<math.h>#include <memory>#include <cstr原创 2017-09-18 15:45:03 · 502 阅读 · 0 评论 -
C++多线程重点难点(二)理解
C++多线程同步互斥原创 2017-09-06 17:48:41 · 2297 阅读 · 0 评论 -
LeetCode_TwoSum、C++解法
时间复杂度O(n),利用C++STL库函数就可以解决问题; 当然网上还有一种解法,排序+二分,时间复杂度也可以是O(n),这里就不写了这里要特别说明的是: 本来我是想用hash_map来写这个程序,但是发现VS2017报错,hash_map is deprecated and will be removed 意思是:hash_map已经被弃用 于是我查看了MSDN,确实在API文档里面有这句原创 2017-10-15 21:01:51 · 1025 阅读 · 0 评论 -
Windows下的ELF文件解析代码C++
ELF(Executable and Linkable Format)是Unix及类Unix系统下可执行文件、共享库等二进制文件标准格式。ELF文件结构:(1) ELF header (2) Program header table,对应于segments (3) Section header table,对应于sections (4) 被Program header table或S...原创 2018-03-15 23:38:54 · 5695 阅读 · 0 评论 -
C++抽象工厂模式+代码实现
抽象工厂模式(Abstract Factory )抽象工厂模式实现:精髓在这里:抽象工厂模式(Abstract Factory )抽象工厂模式为创建一组对象提供了一种解决方案。与工厂方法模式相比,抽象工厂模式中的具体工厂不只是创建一种产品,它负责创建一族产品。如下图中的ConcreteFactory1是一系列产品,ConcreteFactory...原创 2018-05-02 15:04:45 · 556 阅读 · 0 评论 -
基于KMP算法的TXT文本查询工具
KMP文本查询工具原创 2017-09-04 14:50:09 · 668 阅读 · 0 评论