- 博客(63)
- 收藏
- 关注
原创 C++面试 -sizeof(),计算类的大小
sizeof 类大小计算sizeof 类大小计算空类的大小为1字节#include<iostream>using namespace std;class A{};int main(){ cout << sizeof(A) << endl; // 1 return 0;}一个类中,虚函数本身、成员函数(包括静态与非静态)和静态数据成员都是不占用类对象的存储空间。#include<iostream>using n.
2021-03-26 15:00:29 317
原创 C++面试 - this那些事
this1.this指针this1.this指针对于Python来说有self,类比到C++中就是this指针,那么下面一起来深入分析this指针在类中的使用!首先来谈谈this指针的用处:(1)一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。(2)this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。也就是说,即使你没有写上this指针,编译器在编译的时候也是加上this.
2021-03-26 14:37:38 290
原创 C++面试 - const的全部用法
constconst1.const含义2.const作用3.const对象默认为文件局部变量4.定义常量5.指针与const6.函数中使用const7.类中使用const1.const含义常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的。2.const作用可以定义常量const int a = 100;类型检查const常量与#define宏定义常量的区别:~~const常量具有类型,编译器可以进行安全检查;#defi
2021-03-26 14:16:19 844 2
原创 设计模式——适配器模式(Adapter Pattern)(C++实现)
适配器模式 Adapter Pattern介绍实现适配器模式 Adapter Pattern适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。举个真实的例子,读卡器是作为内存卡和笔记本之间的适配器。您将内存卡插入读卡器,再将读卡器插入笔记本,这样就可以通过笔记本来读取内存卡。我们通过下面的实例来演示适配器模式的使用。其中,音频播放器.
2021-03-17 13:58:05 165
原创 设计模式——原型模式(Prototype Pattern)(C++实现)
原型模式 Prototype Pattern介绍实现参考原型模式 Prototype Pattern原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。例如,一个对象需要在一个高代价的数据库操作之后被创建。我们可以缓存该对象,在下一个请求时返回它的克隆,在需要的时候更新数据库,以此来.
2021-03-17 13:39:32 164
原创 设计模式——建造者模式(Builder Pattern)(C++实现)
建造者模式 Builder Pattern介绍实现参考建造者模式 Builder Pattern建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。介绍意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。主要解决:主要解决在软件系统中,有时候面临着"一个复杂对象.
2021-03-17 13:34:22 250
原创 设计模式——抽象工厂模式(Abstract Factory Pattern)(C++实现)
抽象工厂模式(Abstract Factory Pattern)介绍实现抽象工厂模式(Abstract Factory Pattern)抽象工厂模式是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。介绍意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。主要解决:主要.
2021-03-17 13:32:59 145
原创 设计模式——工厂模式(Factory Pattern)(C++实现)
工厂模式(Factory Pattern)介绍要点实现工厂模式(Factory Pattern)工厂模式是最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。介绍意图:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。主要解决:主要解决接口选择的问题。何时使用:我们明确地计划不同条件下创建不同实.
2021-03-17 13:29:08 296
原创 面试-什么是线程安全?
不是线程的安全私有的东西就不该让别人知道大家不要抢,人人有份只能看,不能摸没有规则,那就先入为主相信世界充满爱,即使被伤害总结不是线程的安全面试官问:“什么是线程安全”,如果你不能很好的回答,那就请往下看吧。论语中有句话叫“学而优则仕”,相信很多人都觉得是“学习好了可以做官”。然而,这样理解却是错的。切记望文生义。同理,“线程安全”也不是指线程的安全,而是指内存的安全。为什么如此说呢?这和操作系统有关。目前主流操作系统都是多任务的,即多个进程同时运行。为了保证安全,每个进程只能访问.
2021-03-09 10:47:10 1185
原创 C++: #和##在宏定义中的作用
#和##在宏定义中的作用# 构串操作符## 合并操作符使用规则Reference#和##在宏定义中的作用# 构串操作符将右边的参数做整体的字符串替换。#define STRING(x) #x#x#define TEXT(x) "Name"#x"__"int test(){ int name = 102; printf("%s\n", STRING(name)); // namename printf("%s\n", TEXT(name)); // Namename.
2021-02-25 15:52:58 191
原创 剑指Offer编程练习029——最小的K个数
题目描述输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。class Solution {public: vector<int> GetLeastNumbers_Solution(vector<int>& input, int k){ int len = i...
2018-10-29 17:10:21 164
原创 设计模式——单例模式(C++实现)
一、单例模式定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。二、应用场景:比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。这种方式简化了在复杂环境下的配置管理。其他还有如系统的日志输出、MODEM的联接需要一条且只需要一条电话线,操作系统只能...
2018-10-29 16:33:10 275
原创 剑指Offer编程练习028——数组中出现次数超过一半的数字
题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。#include<iostream>#include<vector>#include <map>using namespa...
2018-09-25 16:37:49 168
原创 剑指Offer编程练习027——字符串的排列
题目描述输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。输入描述:输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。/*思路:n个元素的全排列=n-1个元素全排列 + 1个元素作为前缀出口:如果只有一个元素的全排列,说明已经排...
2018-09-25 16:36:19 193
原创 Effective C++ 55个条款笔记
一、让自己习惯C++1.视C++为一个语言联邦请记住:C++高效编程守则视状况而变化,取决于你使用C++的哪一部分。 2.尽量以const,enum,inline替换#define宁可以编译器替换预处理器string通常比 char * 更好类的静态常量(static const),在类中声明(头文件),类外定义(实现文件)“enum hack“:一个属于枚举类...
2018-09-25 16:12:00 229
原创 数据结构学习笔记——并查集
为了解释并查集的原理,我将举一个例子。话说江湖上散落着各式各样的大侠,有上千个之多。他们没有什么正当职业,整天背着剑在外面走来走去,碰到和自己不是一路人的,就免不了要打一架。但大侠们有一个优点就是讲义气,绝对不打自己的朋友。而且他们信奉“朋友的朋友就是我的朋友”,只要是能通过朋友关系串联起来的,不管拐了多少个弯,都认为是自己人。这样一来,江湖上就形成了一个一个的群落,通过两两之间的朋友关系串联...
2018-08-26 12:11:25 214
原创 c++实现反射
反射机制在java中是一个非常重要的特性,比如在spring框架中,就使用了xml + 反射来完成类的动态扩展。简单来说,反射就是根据一个字符串查找到一个类,查找到一个函数,并能生成这个类,或者函数的实例。换句话说,就是在运行期通过字符串到内存单元的反向映射。在动态语言中,反射是非常容易实现的,在java中,由于有字节码作为中间层的存在,所以实现也并不复杂。但是对于c++来说,静态编译的程序在运行...
2018-06-29 16:53:13 6537
原创 Google C++单元测试框架---Gtest框架简介
一、设置一个新的测试项目 在用google test写测试项目之前,需要先编译gtest到library库并将测试与其链接。我们为一些流行的构建系统提供了构建文件: msvc/ for Visual Studio, xcode/ for Mac Xcode, make/ for GNU make, codegear/ for Borland C++ Builder.如果你的构建系统不在这个名单上...
2018-06-27 15:00:10 229
原创 Linux程序设计——POSIX线程(一)
线程(thread)是一个进程内部的一个控制序列。所有的进程都至少有一个执行线程。线程中绝大多数函数名以pthread_开头,包含头文件<pthread.h>,在编译程序时加选项-lpthread。线程函数:1.创建一个新线程,该函数调用成功返回0,失败返回错误代码。int pthread_create(pthread_t *thread, pthread_attr_t *attr, ...
2018-06-27 10:29:11 250
原创 Linux程序设计——线程信号量进行同步
信号量(Semaphore),是一个特殊类型的变量,它可以被增加或者减少,对其的关键访问被保证是原子操作。在进入一个关键代码段之前,线程必须获取一个信号量;一旦该关键代码段完成了,那么该线程必须释放信号量。其它想进入该关键代码段的线程必须等待直到第一个线程释放信号量。代码:thread3.c#include <stdio.h>#include <unistd.h>#in...
2018-06-26 16:24:05 241
原创 Linux程序设计——线程互斥量进行同步
互斥量是一个可以处于两态之一的变量:解锁和加锁。为控制对关键代码的访问,必须在进入这段代码之前锁住一个互斥量,然后在完成操作之后解锁它。代码:thread4.c#include <stdio.h>#include <unistd.h>#include <stdlib.h>#include <string.h>#include <pthr...
2018-06-26 15:51:12 218
原创 Linux系统获取用户空间ns级时间精度——clock_gettime
clock_gettime函数原型如下:long sys_clock_gettime (clockid_t which_clock, struct timespec *tp);1.which_clock CLOCK_REALTIME: 系统实时时间,随系统实时时间改变而改变,即从UTC1970-1-1 0:0:0开始计时,中间时刻如果系统时间被用户该成其他,则对应的时间相应改变 ...
2018-06-12 09:55:06 3666
原创 数据结构学习笔记——图
一:基本概念图(Graph):用边连接在一起的顶点的集合。G=(V,E),其中V的元素称为顶点,E的元素称为边。顶点(vertices):图中的节点,存放数据。边(edge):(i,j)表示顶点i和顶点j之间的边。无向边(undirected edge):(i,j)和(j,i)表示的含义一样。有向边(directed edge):(i,j)表示从顶点i到顶点j的边,(j,i)表示从顶点j到顶点i的...
2018-06-06 14:16:09 1300
原创 剑指Offer编程练习026——二叉搜索树与双向链表
题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。#include<stack>using namespace std;struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(...
2018-04-13 18:59:25 119
原创 剑指Offer编程练习025——复杂链表的复制
题目描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)struct RandomListNode { int label; struct RandomListNode *next, *random; RandomL...
2018-04-13 18:57:33 155
原创 剑指Offer编程练习024——二叉树中和为某一值的路径
题目描述输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。思路:深度优先遍历,回溯法#include<vector>using namespace std;struct TreeNode { int val; struct TreeNode *left; struct TreeNode ...
2018-04-12 13:22:54 118
原创 剑指Offer编程练习023——二叉搜索树的后序遍历序列
题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。思路:后序遍历的顺序是,左右根#include<vector>using namespace std;class Solution {public: bool VerifySquenceOfBST(vector<int&...
2018-04-12 13:20:51 136
原创 剑指Offer编程练习022——从上往下打印二叉树
题目描述从上往下打印出二叉树的每个节点,同层节点从左至右打印#include<vector>#include<queue>using namespace std;struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(...
2018-04-09 09:56:23 136
原创 剑指Offer编程练习021——栈的压入弹出序列
题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)//思路:压栈和出栈操作可能是交替进行的class Solution {public: ...
2018-04-09 09:53:19 121
原创 剑指Offer编程练习020——包含min函数的栈
题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。//思路:两个栈,借助一个辅助栈min,将每次压入的元素与min栈顶的元素比较,比栈顶元素小就压栈class Solution {public: void push(int value) { a.push(value); if(smin.empty()) ...
2018-04-09 09:51:29 128
原创 剑指Offer编程练习019——顺时针打印矩阵
题目描述输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.思路:上下左右四个哨兵#include<iostream>#include<...
2018-04-08 09:37:31 176
原创 剑指Offer编程练习018——二叉树的镜像
题目:操作给定的二叉树,将其变换为源二叉树的镜像。输入描述:二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ 11 9 7 5思路:递归,交换左右子树#include...
2018-04-08 09:33:51 125
原创 内存对齐问题
字节对齐主要是为了提高内存的访问效率,比如intel 32位cpu,每个总线周期都是从偶地址开始读取32位的内存数据,如果数据存放地址不是从偶数开始,则可能出现需要两个总线周期才能读取到想要的数据,因此需要在内存中存放数据时进行对齐。通常我们说字节对齐很多时候都是说struct结构体的内存对齐内存对齐的三大规则:1.对于结构体的各个成员,第一个成员的偏移量是0,排列在后面的成员其当前偏移量必须是当...
2018-04-04 09:29:58 280
原创 数据结构学习笔记——红黑树
一:基本概念红黑树(Red Black Tree):是一棵二叉搜索树,树中的每一个节点是红色或者黑色。扩充二叉树:在二叉树中出现空子树的位置增加空树叶的二叉树,增加的空树叶叫外部节点。红黑树的其他性质可以用扩充二叉树来说明:1.根结点和所有外部节点都是黑色的;2.在根结点至外部节点的路径上,没有连续的两个红色节点;3.从一个节点到它所能到达的外部节点的路径上的黑色节点数都相同。二:红黑树的旋转在插...
2018-04-02 09:29:24 281
原创 C++知识点梳理——vector
一:vector简介标准库类型vector表示对象的集合,属于顺序容器。vector是类模板,使用时需要提供元素的类型来指定模板到底实例成什么样的类,例如vector<int>。使用vector要包含头文件:#include<vector> using std::vector;或者using namespace vector;二:定义和初始化v...
2018-03-28 19:00:15 215
原创 剑指Offer编程练习017——树的子结构
题目:输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { }};*/class Solution {p...
2018-03-28 12:42:33 111
原创 剑指Offer编程练习016——合并两个排序的链表
题目:输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solution {public: ListNode* Merge(ListNode* ...
2018-03-28 12:37:39 710
原创 剑指Offer编程练习015——反转链表
题目:输入一个链表,反转链表后,输出链表的所有元素。/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solution {public: ListNode* ReverseList(ListNode* pHead) { }};思路...
2018-03-28 12:36:21 151
原创 剑指Offer编程练习014——链表中倒数第k个结点
题目:输入一个链表,输出该链表中倒数第k个结点。/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solution {public: ListNode* FindKthToTail(ListNode* pListHead, unsign...
2018-03-27 13:34:39 106
原创 剑指Offer编程练习013——调整数组顺序使奇数位于偶数前面
题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。思路:再造一个数组,将元素组中的奇数和偶数分别取出放入新数组class Solution {public: void reOrderArray(vector<int> &array) { ...
2018-03-27 13:32:10 97
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人