自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 OPPO8.29C++蜜汁题目

数论知识:求关于x的同余方程  ax≡1(modb)\ a x \equiv 1 \pmod {b} ax≡1(modb) 的最小正整数解。注意:(a*x)%mod=((a%mod)*x)%mod (a∗x)%mod=((a%mod)∗x)%mod\ (a *x)\%mod = ((a\%mod)*x)\%mod (a∗x)%mod=((a%mod)∗x)%mod输入: a b\ {a} \ {b} a b 以空

2020-08-29 21:50:44 315

原创 socket编程流程总结

Windows socket网络编程 流程示例 一.TCP流式套接字的编程步骤服务器端程序流程服务器端代码客户端程序流程客户端代码二.UDP型套接字的编程步骤服务器(接收)端程序服务器端代码客户端端代码三.聊天程序中的注意事项网络字节序创建socket服务器的步骤Socket函数分析sockaddr地址结构体分析bind函数的分析listen函数分析accept函数分析connect函数分析小Tips(以后专门整理)一.TCP流式套接字的编程步骤在使用之前须链接库函数:工程->设置->Lin

2020-08-29 18:34:18 5605

原创 C++内存泄露情况汇总

1.在类的构造函数和析构函数中没有匹配的调用new和delete函数两种情况下会出现这种内存泄露:一是在堆里创建了对象占用了内存,但是没有显示地释放对象占用的内存;二是在类的构造函数中动态的分配了内存,但是在析构函数中没有释放内存或者没有正确的释放内存没有正确地清除嵌套的对象指针在释放对象数组时在delete中没有使用方括号方括号是告诉编译器这个指针指向的是一个对象数组,同时也告诉编译器正确的对象地址值病调用对象的析构函数,如果没有方括号,那么这个指针就被默认为只指向一个对象,对象数组中

2020-08-27 10:40:30 300

原创 大小端与字节序转换

大端小端不同机器内部对变量的字节存储顺序不同,有的采用大端模式(big-endian),有的采用小端模式(little-endian)。大端模式是指高字节数据存放在低地址处,低字节数据放在高地址处。小端模式是指低字节数据存放在低地址处,高字节数据放在高地址处。举例来说,数值0x2211使用两个字节储存:高位字节是0x22,低位字节是0x11。大端字节序:高位字节在前,低位字节在后,这是人类读写数值的方法。小端字节序:低位字节在前,高位字节在后,即以0x1122形式储存。0x1234567的大

2020-08-26 11:25:03 7921

原创 Union和Struct

联合说明和联合变量定义联合也是一种新的数据类型, 它是一种特殊形式的变量。联合说明和联合变量定义与结构十分相似。其形式为:union 联合名{ 数据类型 成员名; 数据类型 成员名; ... } 联合变量名; 联合表示几个变量公用一个内存位置, 在不同的时间保存不同的数据类型 和不同长度的变量。下例表示说明一个联合a_bc:union a_bc{ int i; char mm; }; 再用已说明的联合可定义联合变量。例如用上面说明的联合定义一个名为lgc的联合变量

2020-08-26 00:06:36 192

原创 TCP HTTP Socket的联系

1、OSI网络七层模型第一层:应用层。定义了用于在网络中进行通信和传输数据的接口;(Http协议位于该层)第二层:表示层。定义不同的系统中数据的传输格式,编码和解码规范等;第三层:会话层。管理用户的会话,控制用户间逻辑连接的建立和中断;第四层:传输层。管理着网络中的端到端的数据传输;(Tcp协议位于该层)第五层:网络层。定义网络设备间如何传输数据;(IP位于该层)第六层:链路层。将上面的网络层的数据包封装成数据帧,便于物理层传输;第七层:物理层。这一层主要就是传输这些二进制数据。2、TCP连

2020-08-25 23:49:05 138

原创 shared_ptr与weak_ptr的手写实现

C++11的智能指针是RAII(Resource Acquisition Is Initialization)机制的一种体现。详细的介绍请参见原文原文1对RAII的介绍请参见这里原文2考察较多的就是shared_ptr的手写实现了,这里不是源码,只是模拟实现。template<class T> //模板class Share_ptr{ // weak_ptr的friend friend class Weak_ptr<T>; //这里先不用在意,稍后解释p

2020-08-24 21:13:46 719 1

原创 进程间通信方式扫盲式简介

进程的概念进程是操作系统的概念,每当我们执行一个程序时,对于操作系统来讲就创建了一个进程,在这个过程中,伴随着资源的分配和释放。可以认为进程是一个程序的一次执行过程。进程通信的概念进程用户空间是相互独立的,一般而言是不能相互访问的。但很多情况下进程间需要互相通信,来完成系统的某项功能。进程通过与内核及其它进程之间的互相通信来协调它们的行为。进程通信的应用场景数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几兆字节之间。共享数据:多个进程想要操作共享数据,一个进程对共享数

2020-08-23 18:27:17 85

转载 进程与线程

(不想在每次面试前都搜一遍了,直接找了个大佬的靠谱答案)进程和线程的深入理解下面是抽象类比:单CPU:一台单核处理器计算机 = 一个车间;多CPU:一台多核处理器计算机 = 一座工厂;进程:一个车间 = 一个进程; (即一个运行的程序)多进程:一座工厂可以同时运行多个车间;CPU和进程:单CPU只能同时运行单个进程,多CPU可以同时运行多个进程。线程:车间内一个工人 = 一个线程;进程与线程:一个进程可以包括多个线程。线程间内存共享:车间的空间是工人们共享的,比如许多房间是每个工人都可

2020-08-23 00:43:26 93

原创 单链表排序(快排方法)

原文说一下我的理解:是传统快排的变种;传统快排:基准 小 小 小 小 小  未排 未排 未排 未排  大 大 大 大 大          L->     <- RL,R相向而行,即R向左走找比基准小的, L向右走找比基准大的,交换,相遇时结束。但对于链表,L向右当然是可以的,但R向左,就要额外存储pre,或者频繁的单向遍历。为了简化,可以这样:基准 小 小 小 小 小  大 大 大 大 大  未排 未排 未排 未排       L->         R->

2020-08-23 00:26:23 1768

原创 8.19华为笔试题目c++

别家的笔试总是做的很差,偏偏做华为的就有状态。。。首先得感谢牛客的@当可乐遇上曼妥思贴出来的题目1.给你N行M列的人,他们是一个方阵。左上角是(0,0),右下角是(n-1, m-1),最外圈的人顺时针报数,当他们报的数个位是7并且十位是奇数,就选出来。外圈报完了内圈接着报,一直到所有人都报完,问最后选出来的是哪些。要求是10<=n,m<=1000,如果输入不合法,那么就是返回空数组。好像很多人卡在空数组的输出上了。输入10 10输出[[7,9],[1,1],[8,2],[7,

2020-08-19 23:40:44 760

转载 C++二维数组的建立方法和指针数组/数组指针的理解

https://blog.csdn.net/qq_26822029/article/details/85037209上面这篇说得更详细。1.A (*ga)[n] = new A[m][n];...delete []ga;缺点:n必须是已知优点:调用直观,连续储存,程序简洁(经过测试,析构函数能正确调用)A** ga = new A*[m];for(int i = 0; i < m; i++) ga[i] = new A[n];...for(int i = 0; i &l

2020-08-17 17:31:17 463

原创 char *,char[],strcpy的终极解答

有一篇文章把关键点都写了https://blog.csdn.net/qq_43265890/article/details/89568638另外关于堆区,栈区,常量区的讨论网上也有很多,这里再讨论一些细枝末节的事情char *s = “abc”;这个在常量区,常量区的值可读不可写,如:s[1] = “d”;这样的方式会报错,但是可以给指针重新赋值 s = “add”。char s[] = “abc”; s[]是一个数组,在栈中占3个字节,存放的分别是’a’,‘b’,‘c’; s不是指针。sizeof

2020-08-17 16:09:41 4129

原创 C语言读写文件操作汇总

C文件读写操作一、标准文件的读写1.文件的打开fopen()2.关闭文件函数fclose()3.文件的读写(1).读写文件中字符的函数(一次只读写文件中的一个字符):(2).读写文件中字符串的函数4.清除和设置文件缓冲区(1).清除文件缓冲区函数:(2).设置文件缓冲区函数5.文件的随机读写函数(1).移动文件指针函数:(2).文件随机读写函数二、非标准文件的读写1.文件的打开和关闭2.读写函数3.随机定位函数一、标准文件的读写1.文件的打开fopen() 文件的打开操作表示将给用户指定的文

2020-08-17 15:04:05 1018

原创 vector的内存释放

1.vector内存分配机制C++中vector的一个特点是: 内存空间只会增长,不会减小。即为了支持快速的随机访问,vector容器的元素以连续方式存放,每一个元素都挨着前一个元素存储。设想,如果每次vector添加一个新元素时,为了满足连续存放这个特性,都需要重新分配空间、拷贝元素、撤销旧空间,这样性能就会非常慢。  所以,实际上分配时其容量要比当前所需容量更多,即vector预留了一些额外的存储区,这样就不必单独为每个新元素重新分配内存空间,减少开销。 另外,在vector中内存只增不减体现在 -

2020-08-17 12:24:51 6345

原创 几篇关于set的用法文章

原文1不过里面关于迭代器的一些说法不太对C++ primer (中文版第四版)第273页9.3.2 begin和end成员begin和end操作产生指向容器内第一个元素和最后一个元素的下一个位置的迭代器,如下所示。这两个迭代器通常用于标记包含容器中所有元素的迭代范围。c.begin() 返回一个迭代器,它指向容器c的第一个元素c.end() 返回一个迭代器,它指向容器c的最后一个元素的下一个位置c.rbegin() 返回一个逆序迭代器,它指向容器c的最后一个元素c.rend() 返回一个逆序

2020-08-16 22:07:57 217

原创 atoi stoi 以及数字与字符串的相互转换(sstream的使用)

https://www.cnblogs.com/weedboy/p/7160152.html1.c++的atoi和stoi一些区别对c++标准库中字符串转化为int的两个函数atoi()和stoi()两个有所混乱,特地研究了一下。stoi()标准库的函数默认模板int stoi (const string& str, size_t* idx = 0, int base = 10);int stoi (const wstring& str, size_t* idx = 0, int

2020-08-15 23:13:27 1253

原创 8.15美团笔试和奇葩赛码网的输入坑

第一次用赛码网,两个小时的笔试居然有一个半小时在查如何正确输入,最要命的是在本地IDE上可以的输入到了网页上就GG了。看来是leetcode刷多了,文件流那块学的也很糟糕。总结一下下次避免跳坑吧。一行的就不说了,用一个多行输入做例子。6beijing nanjingnanjing shanghaishanghai wuhanwuhan beijingxiamen tianjintianjin xiamen分析:6是6行。目标是将每个城市名单独存放,这样考虑使用vector存放strin

2020-08-15 21:36:10 5300 1

原创 在MFC中实现只能同时打开一个同种程序(某种意义上的单例,进程间)

在MFC中实现只能同时打开一个同种程序方法就是,(以对话框为例),在你的MFCApplication.cpp文件中,找到InitInstance()函数里的开头部分,(一般在定义theApp那个地方的后面)添加如下代码HANDLE hMutex = CreateMutex(NULL, TRUE, TEXT("125096"));if (hMutex){ if (ERROR_ALREADY_EXISTS == GetLastError()) { //AfxMessageBox(_T("程序已在

2020-08-14 23:56:51 452

原创 构造函数调用顺序(2)

上一篇说了一般的调用的顺序法则和拷贝构造函数的调用,这里着重讨论在有继承条件下构造函数的调用,包括了继承,虚继承,多继承。C++构造函数初始化顺序重要!(后面的不看,记住这些也足够了):C++构造函数按下列顺序被调用:(1、2、3、4是按照优先级顺序来的!)(1)任何虚拟基类的构造函数按照它们被继承的顺序构造;(2)任何非虚拟基类的构造函数按照它们被继承的顺序构造;(3)任何成员对象的构造函数按照它们声明的顺序调用;(如果成员对象有前面出现过的父类,那么还会调用此对象父类的构造函数一遍,因为第一

2020-08-14 20:01:35 715

原创 关于构造函数,拷贝构造函数,析构函数的调用顺序(1)

导言对象是由“底层向上”开始构造的,当建立一个对象时,首先调用基类的构造函数,然后调用下一个派生类的构造函数,依次类推,直至到达派生类次数最多的派生次数最多的类的构造函数为止。因为,构造函数一开始构造时,总是要调用它的基类的构造函数,然后才开始执行其构造函数体,调用直接基类构造函数时,如果无专门说明,就调用直接基类的默认构造函数。在对象析构时,其顺序正好相反。 下面简单介绍下这三个函数。构造函数1.构造函数不能有返回值2.缺省构造函数时,系统将自动调用该缺省构造函数初始化对象,缺省构造函数会将所有数

2020-08-14 18:31:13 2137 1

原创 C++pair和make_pair

在做leetcode102 分组输出二叉树层序遍历结果时,想在队列中存放<Treenode*,int>来记录该节点所在层次。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {}

2020-08-14 17:47:10 674

原创 归并排序

感谢博客https://blog.csdn.net/a130737/article/details/38228369归并排序的时间复杂度为o(nlgn),空间复杂度为o(n)。是一种采用分治思想的排序方法。逻辑分析:假设输入数组a[] = { 2, 1, 4, 5, 3, 8, 7, 9, 0, 6 }。首先将数组二分成两个数组left[]={ 2, 1, 4, 5, 3},right= {8, 7, 9, 0, 6 }。再将left和right两个数组二分,一直到每一个单独元素为一个数组。{

2020-08-13 16:38:57 93

转载 STL中list的remove和remove_if的用法

stl list 删除元素list.remove()和list.remove_if()函数 (list.remove() and list.remove_if() functions)remove() function is used to remove all occurrences of a given element from the list and function remove_if() is used to remove set of some specific elements from

2020-08-10 17:45:54 2564 1

原创 排序算法复杂度

关于各种排序的复杂度,网上的资料不少,谬误也比较多,更甚者以讹传讹,初学者不加分辨地记下,实在是误人子弟。你们肯定搜到过下面这张图,这个分类是没问题的。比如下面这张图就有很多错误。其实记这些东西,知其所以然是最重要的。最后附上我认为比较正确的总结图吧。(如果有错误请指出,一定及时改正)另外,上图中所说的in-place和out-place并不是内排序和外排序,解释如下:in-place 占用常数内存,不占用额外内存 out-place 占用额外内存在冒泡排序中,为了将arr排序,借用了一个

2020-08-07 11:34:24 186

原创 虚函数和普通类成员函数在内存中是怎样存放的?

之前一直在讨论虚函数有关的知识,但不能忘记最基本的类成员函数。可以看下面这篇和我之前写的一篇先复习一下虚函数,虚函数表,虚继承等等https://www.cnblogs.com/jerry19880126/p/3616999.html然后存储区域明确一下:C++中,虚函数表位于只读数据段(.rodata),即:C++内存模型中的常量区;虚函数代码则位于代码段(.text),也就是C++内存模型中的代码区;只提到了虚函数和存放位置,那么类额普通成员函数呢?有一篇好文,提到了类的静态成员函数

2020-08-07 00:04:43 2648

原创 c++单例模式扫盲

单例模式:目的:保证每个类只有一个静态对象实现方式:1.构造函数私有化2.公有静态类对象指针3.产生静态类对象指针的公有函数分类:懒汉式:在需要的时候才进行初始化优点:避免内存消耗缺点:需要加锁,影响执行效率饿汉式:一开始就进行初始化优点:不需要加锁,执行速度快缺点:会造成内存消耗注意:1.双检索机制—>懒汉式,在判断之前需要在加上一个锁2.资源//singleton.h#pragma once#include <mutex>class single

2020-08-06 23:19:02 169

原创 哈希表/哈希冲突及解决方法(较全)

前导(题外话):关于哈希函数的选取,可以参见这篇文章,另外常见的字符串哈希函数及c++代码实现可以看这里主要有:常用的字符串Hash函数还有ELFHash,APHash等等,都是十分简单有效的方法。这些函数使用位运算使得每一个字符都对最后的函数值产生影响。另外还有以MD5和SHA1为代表的杂凑函数,这些函数几乎不可能找到碰撞。常用字符串哈希函数有BKDRHash,APHash,DJBHash,JSHash,RSHash,SDBMHash,PJWHash,ELFHash等等。BKDRHash无论是在实

2020-08-06 23:14:52 8849

原创 MFC中的字符转换

字符转换1. CString向char类型转换 CString str = "hello"; string st = (string)(CStringA)str; int len = st.length(); char* ch = (char*)malloc(len); //动态申请char*大小的空间 for(int i = 0 ; i <len ; i++){ ch[i] = st[i];} ch[len] = '\0'; 2. int向CString类型的转换

2020-08-06 18:38:26 393

原创 MFC知识点和常用类控件的使用

一:消息1.什么是消息?消息是驱动windows系统运行的基础。从计算机的角度来看,消息就是一个整数。(1)一个无符号整数,是消息值;(2)消息附带的WPARAM和LPARAM类型的参数;(3)其实我们一般所说的消息是狭义上的消息值,也就是一个无符号整数,经常被定义为宏。2.消息映射机制:MFC使用消息映射机制来处理消息,在程序框架中的表现就是,在程序中有一个消息与消息处理函数组成的消息映射,每条消息都有与之相对应的消息处理函数。当窗口接收到消息时,会到消息映射表中查找该消息对应的消息处

2020-08-06 18:29:27 652

原创 关于TOP K算法的由浅入深

关于优化的思想,可以参见原文链接总的来说,方法和时间复杂度如下:全局排序,O(n*lg(n))局部排序,只排序TopK个数,O(n*k)堆,TopK个数也不排序了,O(n*lg(k))分治法,每个分支“都要”递归,例如:快速排序,O(n*lg(n))减治法,“只要”递归一个分支,例如:二分查找O(lg(n)),随机选择O(n)TopK的另一个解法:随机选择+partition另外再补充下代码部分1.大小顶堆做法,不用priority_queue#include <iostream&

2020-08-06 18:17:10 243

原创 sizeof和strlen的区别——终极教程,有这一篇就足够了!

https://blog.csdn.net/magic_world_wow/article/details/80500473char* s = "0123456789";sizeof(s); //结果 4 ===》s是指向字符串常量的字符指针sizeof(*s); //结果 1 ===》*s是第一个字符strlen(s); //结果 10 ===》有10个字符,strlen是个函数内部实现是用一个循环计算到\0为止之前strlen(*s); // ==

2020-08-01 23:20:43 189

原创 基类指针指向子类对象的原理解释——类的内部存储结构和内存分布及虚继承时的特殊情况

之前粗浅得了解了基类指针指向子类对象时,会舍弃子类所独有的那一部分。直观地来看,这是通过解引用父类指针后,无法通过它来访问子类类成员变量,但可以通过虚函数表来调用子类重写的虚函数。这一部分可以搜很多文章来看,基本很清晰。如C++ 虚函数表、函数地址、内存布局解析讲的很不错再者还有一篇 C++类的内存分布也利用 /d1 reportSingleClassLayoutXXX 这个命令行来直接查看类的内存分布,并且一并可以看懂结构体内存对齐。先把一个前置结论放在这:存在继承关系时,父类成员变量放在前面,子

2020-07-29 18:26:02 1062

原创 VIVO春招编程题数位之积

解答区看到的。。。代码简洁,逻辑清晰,给大佬们跪了。。原题目现给定任意正整数 n,请寻找并输出最小的正整数 m(m>9),使得 m 的各位(个位、十位、百位 ……)之乘积等于n,若不存在则输出 -1。输入例子1: 36输出例子1: 49输入例子2: 100输出例子2: 455class Solution {public: /** * 输入一个整形数值,返回一个整形值 * @param n int整型 n>9 * @return int整

2020-06-25 11:09:46 211

原创 2020VIVO春招编程题手机解锁图案

菜鸡看到这个题目后,想法很多,实现感觉挺难。。但网上找的C++的实现都不太靠谱。看到一篇java实现的感觉逻辑清晰,为他点个赞,稍微改下C++。原文:JAVA实现改变上主要是数组定义,已经数组需要初始化;(不赋0初始化总是出错,有专业同学解释下吗)#include<iostream>using namespace std;class Solution {public: //用来存储两个键相连经过其他键情况 //vector<vector<int>>arr

2020-06-25 10:46:39 501

原创 2020VIVO春招编程题 手机产量

菜鸡捡了最简单的一题做做。。。class Solution {public:int solution(int n){ int sum=0; int curgap=1; int i=1; while(n){ for(int j=1;j<=curgap;j++){ sum+=curgap; i++; if(i>n) return sum;} curgap++;

2020-06-24 19:35:31 687

原创 基类指针指向子类对象时的函数调用判断

以下用来学习基类指针指向子类对象时的情况即Base *pB = new Derived();分析其创建过程:1.new一个子类对象,为其生成一个指向该种子类虚函数表VTable的指针vptr,指向Derived::func();2.创建一个基类指针指向它,基类没有的成员变量将无法通过该指针解引用后调用,但vptr还是那个vptr,vptr指向的虚函数表里还是Derived::func();目前来看这种判断方法还没有出错#include<iostream>using namespa

2020-06-23 16:40:09 901

原创 再次回顾typedef

之前转载了两篇文章非常详细,今天再来回顾下重点1.陷阱一:记住,typedef是定义了一种类型的新别名,不同于宏,它不是简单的字符串替换。比如: 先定义: typedef char* PSTR;然后: int mystrcmp(const PSTR, const PSTR);const PSTR实际上相当于const char吗?不是的,它实际上相当于char const。原因在于const给予了整个指针本身以常量性,也就是形成了常量指针char const。*简单来说,记住当const和t

2020-06-11 10:58:35 104

原创 C++中关于重载运算符

相信很多朋友和我一样一开始看的时候很不理解对*的重载(类内定义)CMyTime CMyTime::operator*(double n) const //重载为乘法运算符函数。{CMyTime result;long totalMinutes = m_hours * 60 * n+ m_minutes *n;result.m_minutes = totalMinutes % 60;result.m_hours = totalMinutes / 60;retur

2020-06-10 17:35:25 144

转载 C++调试窗口暂停以及getchar和getch的区别

原文地址程序结尾,return之前加system("pause");不过一般的时候不建议用这条命令可以改用std::cin.get或getchar()为何不要用system(“pause”)? 有两个理由 一 : 不具可移植性 二 : 这东西很贵贵在那里?让我们来看看system(“pause”)的流程 1 : 暂停你的程式 2 : 在sub-process中启动OS 3 :寻找要执行的命令并为之分配记忆体 4 : 等待输入 5 : 回收记忆体 6 : 结束OS 7 : 继续你的程式这将

2020-06-10 16:20:43 817

ChattingRoom-master.rar

可以查看我的博客了解它地一些基本架构,适合入门。

2021-06-17

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

TA关注的人

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