自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(33)
  • 资源 (1)
  • 问答 (1)
  • 收藏
  • 关注

原创 造轮子之常用函数的封装

常用函数的封装常用函数的封装:字符串操作常用函数大小写转换函数分割字符串函数字符串转换函数字符串替换函数时间操作常用函数帮助类定义字符串操作封装class YR_Common{public: //去掉头部及尾部的字符或者字符串 //bool为true 去除s中的每个字符,为false去除s字符串 static string trim(con...

2019-09-03 15:58:16 190

原创 造轮子之线程池的设计与封装

线程池的设计线程池,顾名思义就是一个存放了已经创建好的线程资源的池子,当有任务提交给线程池的时候,池中的某一个线程就会执行该任务,执行完毕之后就会回到池子中等待下次执行任务。从上图中我们可以看到,实现一个线程池应该具备下列要素:线程队列:提交的任务缓冲在这里线程数量管理功能任务拒绝策略队列长度线程安全队列的封装线程安全队列的封装线程池的定义class YR_ThreadP...

2019-09-03 15:56:45 166

原创 造轮子之线程安全队列的封装

线程队列的封装C++中虽然有std::queue、std::deque这些队列容器,但是不是线程安全的,因此我们需要封装一个线程安全的线程队列。定义template <class T, class Container = std::queue<T>>class YR_Thread_Queue : protected YR_ThreadLock{public: ...

2019-09-03 15:56:00 210

原创 造轮子之线程控制类的封装

线程控制类的封装线程常用方法int pthread_join(pthread_t thread, void **retval);int pthread_detach(pthread_t thread);pthread_t pthread_self(void);int pthread_create(pthread_t *thread, const pthread_attr_t *attr,...

2019-08-30 18:51:48 125

原创 造轮子之线程锁监控类的封装

线程锁监控类的封装互斥锁一个明显的缺点是它只有两种状态:锁定和非锁定。而条件变量通过允许线程阻塞和等待另一个线程发送信号的方法弥补了互斥锁的不足,它常和互斥锁一起配合使用。使用时,条件变量被用来阻塞一个线程,当条件不满足时,线程往往解开相应的互斥锁并等待条件发生变化。一旦其他的某个线程改变了条件变量,他将通知相应的条件变量唤醒一个或多个正被此条件变量阻塞的线程。这些线程将重新锁定互斥锁并重新测试...

2019-08-30 18:50:24 127

原创 造轮子之线程条件类的封装

线程条件类的封装线程条件的基本操作#include <pthread.h>//条件的销毁和初始化int pthread_cond_destroy(pthread_cond_t *cond);int pthread_cond_init(pthread_cond_t *restrict cond, const pthread_conda...

2019-08-28 17:04:12 97

原创 造轮子之线程锁的封装

线程锁的封装线程锁的基本操作:1. 创建锁 int pthread_mutex_init(pthread_mutex_t*mutex, const pthread_mutexattr_t * attr); attr:创建锁的属性。一般默认为NULL,分为以下几个属性: * PTHREAD_MUTEX_TIMED_NP,这是缺省值,也就是普通锁。当一个线程加锁以后,其余请...

2019-08-28 17:02:06 197

原创 造轮子之锁的封装

锁异常的封装,继承与自定义的异常类即可。struct YR_Lock_Exception : public YR_Exception{ YR_Lock_Exception(const string& buffer) : YR_Exception(buffer){} YR_Lock_Exception(const string& buffer, int err) : Y...

2019-08-26 12:11:36 128

原创 造轮子之异常的封装

异常的封装这里展示的是自定义异常类,继承与exception类。#include <stdexcept>namespace youren {////////////////////////////////////////////////class YR_Exception : public exception{public: YR_Exception(const st...

2019-08-26 12:10:37 121

原创 C++新特性之Variadic Template

可变参数模板的定义可变参数模板是至少有一个参数宝的模板,参数包则是可以接受零个或者更多模板实参的模板形参,其格式如下:template &lt;class ...T&gt; class classname;template &lt;class ...T&gt; void func(T ...args);其中T为模板参数包,args为函数参数包。可变参数模板可以用任意数量的模板参数实例...

2018-09-21 00:46:23 337

原创 C++新特性之Type Alias、noexcept、override、final

1. Type Alias(类型别名)and Template Alias(模板别名)在C++11中,我们不仅可以为类型定义别名,还可以对模板进行定义别名。别名声明的语法1. using identifier = type-id //identifier为引入的类型名,type-id为抽象声明器或者任何合法的type-id2. template &lt;template-pa...

2018-09-19 23:05:44 1176

原创 C++新特性之lambda表达式

什么是lambda表达式?一个lambda表达式表示以一个可以调用的代码单元。或者理解为一个匿名的内联函数。与任何函数类似,一个lambda具有返回类型、一个参数列表和一个函数体。与函数不同,lambda可能定义在函数内部。为什么要有lambda表达式?我们知道,在STL所提供的算法中,往往有两个版本。其中一个版本表现最直观的的某种运算,第二个版本则表现出最泛化的演算流程,允许用户...

2018-09-14 01:24:05 139

原创 C++新特性之decltype指定符

在上一篇我们学习了C++新特性的auto特性,其功能是对变量和函数的返回值进行类型推断。在C++新特性中还具有一个类型推断的指定符,那就是decltype。 C++新特性之auto指定符 那既然有了auto,那为什么还要出个decltype?两者有什么不同?等我们学完这个指定符就明白了。语法1. decltype(entity) //检查实体的声明类型2. de...

2018-09-11 23:59:35 208

原创 C++新特性之auto指定符

在C++11发布之前,C++定义变量必须指定变量的类型,不像拥有“类型自动推断”技术的语言,比如python。当C++11发布后,C++也拥有了“类型自动推断”技术,即auto关键字和decltype关键字。我们在这里描述auto关键字的用法。语法//变量1. auto variable initializer //从其初始化器自动推导变量类型//函数2. aut...

2018-09-11 00:09:59 209

原创 #include的路径及顺序

在使用标准的头文件包含顺序可增强可读性,避免隐藏依赖。#include的路径项目内头文件应按照项目源代码目录树结构排列,避免使用UNIX特殊的快捷目录.(当前目录)或..(上级目录)。例如,project/src/base/logging.h应该按照如下方式包含:#include "base/logging.h"#include的头文件包含顺序如果dir/foo.c...

2018-09-10 00:25:44 11535

原创 C++从源文件到执行文件的过程

1.编译链接的目的编译的目的是将C语言转换为计算机可以直接识别的语言,即机器语言(0和1)。众所周知,C语言是高级语言,它是由机器语言,汇编语言逐步演化而来,并非计算机可以直接识别。所以我们要将C语言转化为计算机可以识别的语言,就要进行编译和链接。2.编译链接的过程2.1 编译过程预处理 通常用来处理带#的行和删除注释。 比如处理条件编译(#if、#ifdef、#...

2018-09-10 00:23:08 1221

原创 STL源码剖析--迭代器概念与traits技法

迭代器概念与traits技法3.1 迭代器设计思维STL的中心思想在于:将数据容器和算法分开。而迭代器就是将数据容器与算法连接起来。以find()函数为例:template&amp;lt;class InputIterator,class T&amp;gt;InputIterator find(InputIterator first, InputI...

2018-07-28 10:17:07 159

原创 STL源码剖析--内存基本处理工具

内存基本处理工具STL定义有5个全局函数,除了前面的construct(),destory(),还有uninitialized_copy()、uninitialized_fill()、uninitialized_fill_n()函数,它们三个分别应用于STL中高层次函数:copy()、fill()、fill_n()。uninitialized_copytemplate &amp;lt;...

2018-04-21 12:38:27 217

原创 STL源码剖析--重新填充refill()及内存池

重新填充free lists当我们在allocate()分配内存时,如果free list中没有可用的区块,我们调用了_S_refill(),准备为free list重新填充空间,新的空间将取自内存池(由chunk_alloc()完成),缺省取得20个新的节点,但万一内存池空间不足,获得的节点数可能小于20。//返回一个大小为n的对象,并且有时候会为适当的free list增加节点/...

2018-04-19 21:11:32 826

原创 STL源码剖析--第二配置器allocate()和deallocate()

allocate()和deallocate()SGI对第二配置器的allocate()和deallocate()的实现 static void* allocate(size_t __n) { void* __ret = 0; //如果大于128 bytes,调用使用第一级配置器 if (__n &gt; (size_t) _MAX_BYTES) { ...

2018-04-19 21:08:18 855

原创 STL源码剖析--空间配置器alloc

空间的配置与释放std::allocSGI对对象构造前的空间配置与对象析构的空间释放设计哲学为: * 向system heap要求空间。 * 考虑多线程状态。 * 考虑内存不足时的应变措施。 * 考虑过多“小型区块”可能造成的内存碎片问题。在C++中内存配置的基本操作是::operator new(),内存释放基本操作是::operator delete()。而这两个全局函数相当于...

2018-04-14 18:01:16 242 1

原创 STL源码剖析--空间配置器的设计与对象的构造和析构设计

STL空间配置器在C++中,我们习惯的内存配置操作和释放操作是这样的:class Foo { ... };Foo* pf = new Foo; //配置内存,然后构造函数delete pf; //将对象析构,然后释放内存我们一步可以干的事,其实在new和delete算式中都包含两个阶段的操作:对于new: 1.配置内存 ::o...

2018-04-02 23:48:34 246

原创 placement new

placement newoperator new1.void* operator new (std::size_t size);2.void* operator new(std::size_t size,const std::nothrow_t&amp; nothrow_value) noexcept;3.void* operator new (std::size_t siz...

2018-04-01 23:36:32 138

原创 数据结构--二叉树(C++)

零、二叉树解决的问题通过学习数组和链表,前者可以在常数时间内找到目标对象,但是插入和删除操作,都需要耗费线性的时间。后者则可以在常数时间内进行插入和删除,但是查找某一元素,则需要线性时间。很显然各有利弊,所以我们能不能选用一种更好的结构呢?树结构则是很好的选择。在这里我们以二叉树为例,虽为特例,但是我们都可以将任何有序的多叉树转换为二叉树。一、BinNode类的声明与实现二叉树的结点包含数据域、左孩

2017-11-03 21:00:28 401 2

原创 数据结构--链表(C++)

一、ListNode模板类typedef int Rank#define ListNodePosi(T) ListNode<T>*template<typename T> class ListNode {public: T data; ListNodePosi(T) PreNode; ListNodePosi(T) BackNode; //数据,前驱,后继 ListNode()

2017-10-30 21:00:26 328 1

原创 五子棋之Qt实现

分析有两种对弈模式:人人对战和人机对战采用Qt实现界面棋盘大小为19x19黑白任一方先连成5个棋子形成的直线,则该方赢对方输设计该设计有三个模块:棋盘(棋子)模块 主要负责棋盘棋子的绘画判断模块 记录当前结果显示模块 主要刷新棋盘,输出提示信息类视图: 类实现棋盘(棋子)类方法:public: void drawPlate(QPainter&); //在主窗口

2017-08-08 10:28:53 2343

原创 宏函数与普通函数的区别

我们由问题展开:1.什么是宏函数?2.宏函数与普通函数的相同点?不同点?3.宏函数与普通函数的优缺点?什么是宏函数?在这之前看一下宏的定义:宏宏是根据一系列预定义的规则替换一定的文本模式。#define BUFFER_SIZE 1024预处理阶段, fun=(char )malloc(BUFFER_SIZE); 会被替换成 fun=(char )malloc(1024);#define NUMBER

2017-08-02 07:52:49 2634

原创 内存对齐与位域

内存对齐:在讨论之前我们先看一个栗子:#include<iostream>using namespae std;int main(){ struct A { int a; char b; char c; }; struct B { char b; int a; char c;

2017-07-20 13:18:39 589

原创 可变参数函数——printf模拟

我们先看看可变参数函数是怎样用的?printf("%d",value);printf("%s",str);printf("%d %s",value,str);printf函数的声明为:int printf(char const* const _Format,...);//其中三个点表示变参宏可变参数函数的原理: 可变参数列表的实现是由stdarg.h中几个宏组成的:va_list,va_st

2017-07-17 14:06:18 204

原创 理解栈帧

栈顾名思义,“栈”就是相当于”客栈”的意思,在计算机系统中,栈就是数据暂存的一片动态内存。栈可以用来实现函数参数的传递,局部变量的分配和释放,也可以用来储存返回信息,保存寄存器以供恢复调用前处理机状态。每当调用一个函数,系统会为这个函数分配栈空间,为单个函数分配 的栈空间为栈帧(stack frame)。 图中寄存器%ebp为帧指针,寄存器%esp为栈指针假设有一段代码:#include<s

2017-07-16 15:36:00 281

原创 如何用C++实现String类?

我们要实现string类,首先必须了解string类都有哪些操作? 从C++原生string类中我们可以知道:1. string类的定义和初始化: string s1; //默认初始化,s1是一个空字符串 string s2=s1; //s2是s1的副本 string s3="hello"; string s4(10,'c'); /

2017-07-01 23:37:55 340

原创 C++ Prime 之类类型转换(2)

在上一篇的类类型转换中,我们只是学习了将实参的对象类型转换为类类型。这篇我们将学习将一个类类型的值转换为其他类型。我们要首先了解什么是"类类型转换运算符"?书上的定义说:是类的一种特殊的成员函数,形如:`operator *type*() const;` 其中type可以表示任何类型(void除外),只要该类型可以作为函数的返回类型。 注意:类型转换没有显式的返回类型,也没有形参,而且必须为类的

2017-05-26 22:52:02 228

原创 C++ Prime 之 类类型转换初步学习

隐式的类类型转换 :我们先定义一个类:class Person{ public: Person()=default; Person(const std::string &s_name):name(s_name){} Person(std::istream&){} public: Person &is_samename(

2017-05-24 00:37:04 257

80x86汇编语言程序设计教程

80x86汇编语言程序设计教

2014-07-28

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除