自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

个人技术博客

计算机相关技术

  • 博客(32)
  • 收藏
  • 关注

原创 STL 算法

一,算法的泛化过程算法的泛型化过程,考虑的是如何将算法独立于要处理的数据结构,即如何设计一个算法,可以把它用于任何数据结构(vector,list,set,map)。要做到这一点,把要操作的数据结构的类别加以抽象化,把操作的数据结构的标示法和区间目标的移动行为抽象化,整个算法也就在一个抽象层面上工作了,整个过程称为算法的泛型化。实现算法泛型化的关键就是使用迭代器,迭代器作为算法与容器之间的一个

2017-07-31 12:04:13 216

原创 map

一,有关map的操作1,初始化操作map myMap;myMap["messi"] = 1;myMap["jams"] = 2;myMap["jack"] = 3;2,插入操作pair value("json", 4);myMap.insert(value);3,输出集合中的元素for(map::iterator iter = myMap.begin

2017-07-31 10:28:02 636

原创 set

一,有关set的基本操作1,初始化操作//1,定义一个空的setset mySet1;//2,使用数组初始化int nums[] = {4, 3, 2, 1};set mySet2(nums, nums + 4);2,插入操作//1,直接插入值mySet2.insert(7);//2,在指定的位置插入一个值set::iterator iter = mySe

2017-07-29 16:29:06 238

原创 STL 迭代器删除,插入元素发生的事情

一,序列式容器对于序列式容器(vector、list、deque),删除当前的iterator会使后面所有元素的iterator都失效。这是因为vector,deque使用了连续分配的内存,删除一个元素导致后面所有的元素会向前移动一个位置。使用erase方法后,返回的是下一个有效的iterator。例如:vector val = { 1,2,3,4,5,6 }; vector::ite

2017-07-29 15:10:43 2467 2

原创 定义copy构造函数时应注意的问题

一,定义copy构造函数应注意的问题下面定义一个Student类,这个类的copy构造函数的参数是类对象不是对象的引用class Student{private: string name; int age;public: Student(const string &, int age):name(name), age(age){} //copy构造函数

2017-07-28 16:00:50 672

原创 指向字符串的指针与字符数组

一,不能使用字符串常量对字符数组名进行整体赋值操作int main(){ char str[8]; str = "hello"; return 0;}上面的代码在编译时会出错,会报出下面这个错误incompatible types in assignment of 'const char [6]' to 'char [8]'可以使用字符串常量对字符数组进行初始

2017-07-24 11:00:07 2974

原创 &与&&的区别

一,&与&&的区别按位与:a&b是把a和b都转换成二进制数然后再进行与的运算;逻辑与:a&&b就是当且仅当两个操作数均为 true时,其结果才为 true,只要有一个为false,a&&b就为false。&&进行的是短路判断,即如果左侧的表达式的结果为false,整个的结果就为false,不再计算右侧的表达式的值。例如:int main() { int a = 0,

2017-07-24 10:27:11 36685 2

原创 弱引用weak_ptr解决shared_ptr的循环引用

一,引用计数带来的循环引用问题下面是一个简单的例子:#include #include using namespace std;class parent;class children;class parent{public: ~parent(){ cout<<"destroying parent"<<endl; }public: s

2017-07-24 10:09:25 877

原创 static与const的用法

一,static1,函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的生命周期为整个应用程序,只有在第一次使用到这个变量时才会被初始化。2,在函数外声明的static全局变量的连接性是内部的,不能在文件间共享。3,在函数外声明的static函数的连接性是内部的,不能在文件间共享, 只能被同一个文件中的其他函数调用。4,在类中的static成员变量属于整个类所

2017-07-23 15:43:49 392

原创 使用宏定义应注意的问题

一,自定义一个标准宏MIN#define MIN(A, B) ((A) 要注意的问题1,要将定义中的参数与整个宏用括号括起来。2,宏定义可以实现类似函数的功能,但它终归不是函数,而宏定义括号中的"参数"也不是真正的参数,在宏展开时对参数进行的是文本替换。

2017-07-23 09:31:54 1274

原创 指针与数组名之间的区别

一,用sizeof运算符可以算出数组的容量,而把这个运算符应用于指针,得到的是指针变量的大小int main(){ char *p = "hello"; char str[10] = "hello"; cout<<sizeof(p)<<endl; cout<<sizeof(str)<<endl;}输出结果410Process returned 0

2017-07-23 08:23:12 308

原创 定义一个返回内存的函数

一,定义一个返回内存地址的函数void getMemory(char *&p, int size){ p = (char *)malloc(size);}int main(){ char *str = NULL; getMemory(str, 20); if(str != NULL){ strcpy(str, "hello world");

2017-07-23 08:00:53 351

原创 自定义与字符串相关的函数

一,assert()assert宏的原型定义在中,其作用是如果它的条件返回错误,则终止程序执行,原型定义:#include void assert( int expression );assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行。二,strcpy()

2017-07-22 16:53:25 310

原创 条件编译与extern "C"

一,条件编译1,#ifdef           如果宏已经定义,则编译下面代码2,#ifndef         如果宏没有定义,则编译下面代码3,#define        定义宏4,#endif          结束一个#if……#else条件编译块为了避免那些只能包含一次的头文件被多次包含,可以在头文件中用编译时条件来进行控制。可以使用下面的形式#ifnde

2017-07-22 16:05:04 377

原创 C++ 声明与定义的区别

一,声明与定义的区别声明是将一个名称引入程序。定义提供了一个实体在程序中的唯一描述,涉及到内存空间的分配以及初始值的设定。声明和定义有时是同时存在的。1,定义也是声明,extern声明不是定义,即不分配存储空间。int a = 10; //定义就是声明extern int b; //声明,不是定义注意:如果使用extern关键字时,对变量进行了初始化,那就是定义。ex

2017-07-21 15:35:47 8832

原创 在非虚函数中调用虚函数

一,下面是一个在非虚函数中调用虚函数的例子#include using namespace std;class Base {protected: int i;public: Base(int j):i(j){} virtual ~Base(){} virtual void func2(){ i ++; } void fu

2017-07-21 10:51:40 2449

原创 C++ 静态链接库与动态链接库

一,函数库库是别人写好的现有的、成熟的、可以复用的代码。在Windows中常用的库有两种一种是静态库(.lib),另一种是动态库(.dll)。二,静态链接库静态库在程序编译时会被连接到目标代码中,静态库的代码在编译过程中已经被载入可执行程序, 程序运行时将不再需要该静态库,因此体积大。优点:代码装载速度快,执行速度略比动态链接库快。缺点:静态链接库是将全部库中的

2017-07-20 16:28:38 1041

原创 使用this指针注意的问题

一,使用this指针应注意的问题下面的代码在编译时会出错class A{public: ~A(){ delete this; this = NULL; };};问题主要出在this = NULL上,因为在成员函数中this指针的类别是A  *const  this,this是一个常量只能使用不能修改。

2017-07-20 14:44:57 361

原创 使用sizeof获取类的大小

一,一个空类的大小为1class D{public: void display(){}};int main(){ cout<<sizeof(D)<<endl; return 0;}二,一个类的大小只与非静态数据成员和虚函数有关,与其他的成员没有关系class D{private: static int a; double d;

2017-07-20 14:34:40 944

原创 C++ 回调函数

一,回调函数如果参数是一个函数指针,调用者可以传递一个函数地址给实现者,让实现者去调用它,这就是回调函数。同样的我们也可以这样理解回调函数,所谓的回调函数,就是预先在系统对函数进行注册,让系统知道这个函数的存在,以后当某个事件发生时,再调用这个函数对事件进行响应。二,简单的实现一个回调函数#include #include using namespace std;cla

2017-07-20 13:36:28 201

原创 C++ 纯虚函数与抽象类

一,纯虚函数C++通过使用纯虚函数来提供未实现的函数,纯虚函数声明的结尾处为 = 0,下面是一个纯虚函数的声明class Shape{public: virtual void draw() const = 0;};注意:C++允许为纯虚函数提供定义,但是调用它的唯一途径是在调用时指出其class名称,这个性质基本上不会被用到。#includeusing na

2017-07-18 16:28:07 536

原创 存储器管理

一,多级存储器结构对通用的计算机而言,存储层次至少拥有三级:最高层为CPU寄存器、中间层是主存(内存)、最底层是辅存(硬盘)。1,主存储器主存储器(简称内存)是计算机系统的一个重要的部件,用于保存进程运行时的程序和数据。CPU只能从主存储器中取得指令和数据,由于主存储器的访问速度远低于CPU执行指令的速度,为缓和这一矛盾,在计算机系统中引入了寄存器和高速缓存。2,寄存器

2017-07-17 17:09:42 484

原创 操作系统32位与64位的区别

一,操作系统32位与64位的区别32位和64位操作系统是指:CPU一次处理数据的能力是32位还是64位。32位和64位的区别还涉及了内存的寻址方面,32位系统的最大寻址空间是2的32次方= 4294967296(bit)= 4(GB)左右,而64位系统的最大寻址空间的寻址空间则达到了2的64次方= 4294967296(bit)的32次方=数值大于1亿GB。换而言之,就是说32位系统的处理器最

2017-07-17 14:36:01 417

原创 STL 迭代器

一,迭代器迭代器是一种行为类似于指针的对象,指针最常用的操作是解除引用与成员访问,因此迭代器的最重要的工作就是对operator*与operator->进行重载。迭代器提供了一种方法可以顺序访问容器中的各个元素,而又不暴露该容器的内部实现,为遍历不同的容器提供了一个统一的接口。二,迭代器的类型1,输入迭代器输入是从"程序"的角度来讲的,即来自容器的信息被视为输入。输入迭

2017-07-15 10:46:33 349

原创 迭代器模式

一,迭代器模式意图:提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示。作用:为遍历不同的聚合结构提供一个统一的接口。

2017-07-14 11:00:30 257

原创 适配器模式

一,适配器模式意图:将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。主要解决:主要解决在软件系统中,常常要将一些"现存的对象"放到新的环境中,而新环境要求的接口是现对象不能满足的。应用实例:美国电器 110V,中国 220V,就要有一个适配器将 110V 转化为 220V。优点:1、可以让任何两个没有关联的类一起运行。

2017-07-14 10:46:59 242

原创 策略模式

一,策略模式要解决的问题:如何让算法和对象分开来,使得算法可以独立于使用它的客户而变化?解决方法:定义一系列的算法,把每一个算法封装起来, 并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。应用场景:使用策略模式来替换虚函数。

2017-07-13 09:59:04 381

原创 C++ 函数符

一,什么是函数符?函数对象也叫函数符,函数符是可以以函数方式与()结合使用的任意对象。这包括函数名、指向函数的指针和重载了()运算符的类对象。二,使用重载了()运算符的类对象

2017-07-13 09:27:01 2508

原创 处理机调度与死锁

一,调度算法在OS中调度的实质是一种资源分配,调度算法是指:根据系统的资源分配策略所规定的资源分配算法。1,先来先服务调度算法2,短进程优先调度算法是从就绪队列中选择一个估计运行时间最短的进程,将处理机分配给它使用,使它立即执行并一直执行到完成。3,时间片轮转调度算法系统将所有的进程按照先来先服务的原则排成一个队列,每次调度时,把CPU分给队首进程,并令其执行一个时间片,当

2017-07-10 16:14:18 533

原创 线程管理

一,线程的基本概念线程是一个轻量级的进程,引入线程的目的就是为了提高系统的并发性。在传统的操作系统中进程拥有两个基本的属性:一是拥有资源的独立单位;二是可独立调度与分配的独立单位。由于进程是资源的拥有者,因而在创建、撤销、切换中,系统必须为之付出较大的时空开销,引入线程的目的就是为了解决这个问题。二,线程与进程的比较下面从不同的角度对进程与线程进行比较1,调度在传统

2017-07-10 15:25:41 225

原创 进程管理

一,进程的基本概念在传统的操作系统中,程序不能独立的运行,作为资源分配和独立运行的基本单位都是进程,操作系统所具有的四大特征也都是基于进程而形成的。二,进程的特征1,结构特征通常的程序不能并发执行,为使程序能独立运行,应为之配置一进程控制块,即PCB(Process  Control  Block)。而由程序段、相关的数据和PCB三部分构成了进程实体。2,动态性

2017-07-10 14:43:40 272

原创 操作系统引论

一,操作系统的作用可以从不同的角度来观察操作系统的作用1,从用户的角度:      OS是用户与计算机硬件系统之间的接口。2,从资源管理的角度:      OS是计算机系统资源的管理者。3,从应用的角度      OS实现了对计算机资源的抽象,隐藏了对硬件操作的细节。二,操作系统的基本特性1,并发性并发与并行是两个不同的概念,并行指的是两个或多个

2017-07-10 10:28:48 343

C++多线程内存顺序实现原理图

C++多线程内存顺序实现原理图

2024-04-26

pre-commit在提交前对代码进行检查

pre-commit

2024-04-07

代码风格审查工具cpplint

cpplint

2024-04-07

Git 配置BCompare工具

Git 配置BCompare工具

2024-04-07

Qt编程基础 - 第六章-窗体 - 6.4、QWidget 自定义右键菜单

Qt编程基础 - 第六章-窗体 - 6.4、QWidget 自定义右键菜单

2023-08-22

空空如也

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

TA关注的人

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