C++
一把大锤子
这个作者很懒,什么都没留下…
展开
-
【C++】关联容器map的简单使用
map容器一、map容器的定义map是STL的一个关联容器,它是一个单映射容器。它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道。这里说下map内部数据的组织,map内部自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的,后边我们会见识到有序的好处。下面举例说明什么是一对一的数据映射比如一个班级中原创 2020-07-27 15:48:04 · 158 阅读 · 0 评论 -
【C++】关联容器之set的简单使用
set容器set是STL中一种标准关联容器。它底层使用平衡的搜索树——红黑树实现,插入删除操作时仅仅需要指针操作节点即可完成,不涉及到内存移动和拷贝,所以效率比较高。set作为一个容器也是用来存储同一数据类型的数据类型,并且能从一个数据集合中取出数据,在set中每个元素的值都唯一,而且系统能根据元素的值自动进行排序。应该注意的是set中数元素的值不能直接被改变。C++ STL中标准关联容器set, multiset, map, multimap内部采用的就是一种非常高效的平衡检索二叉树:红黑树,也成为R原创 2020-07-26 17:05:00 · 323 阅读 · 0 评论 -
【Linux】Linux面试的经典题目总结---命令部分
一、怎么查看都有哪些进程占用了端口?1、lsof -i用来显示符合条件的进程情况。lsof(list open files)是一个列出当前系统打开文件的工具。在root用户来执行lsof -i命令,如下图所示:lsof输出各列信息的意义如下:COMMAND:进程的名称PID:进程标识符USER:进程所有者FD:文件描述符,应用程序通过文件描述符识别该文件,如cwd、txt等TYPE:文件类型,如DIR、REG等DEVICE:指定磁盘的名称SIZE:文件的大小NODE:索引节点原创 2020-07-25 20:43:22 · 371 阅读 · 0 评论 -
【C++】STL之deque容器的简单实现
deque容器一、deque容器是C++标准模版库STL中的部分内容。deque容器类与vector类似,支持随机访问和快速插入删除,它在容器中某一位置上的操作所花费的是线性时间。与vector不同的是,deque还支持从开始端插入数据:push_front()。二、deque容器的底部是一个双端队列。双端队列的好处就是两端都可以进行插入和删除。但deque容器的底层确实一个受限的双端队列,也就是,如果在头部进行插入的话尾部就只能进行删除操作。如果在头部进行删除的话尾部就只能进行插入的操作。也就是头部只原创 2020-07-25 16:34:59 · 1641 阅读 · 0 评论 -
【C++】标准模板库STL的详解以及vector容器
概念库是一系列程序组件的集合,它们可以在不同的程序中重复使用。库函数设计的第一位的要求就是通用性,而模板为通用性带来了不可估量的前景。STL库是C++中最有特色最实用的部分之一。STL中包含的东西我们将STL划分为6个组件。一、容器类我们又将容器划分为三个部分1、顺序容器(1)vector容器。它是一个矢量容器,它的底部是一个数组。是对顺序表进行了封装。头文件:#include(2)list容器。它也是双向链表容器。它的底部是一个双向链表(环状)。所以它的底部是一个双向循环列表。头文原创 2020-07-23 17:33:11 · 255 阅读 · 0 评论 -
单链表面试题之判断两个链表是否相交
题目描述:思路:如果head1 ==head1,直接返回head1 .否则,分别从head1,head2开始遍历两个链表分别获得长度lenA和lenB如果lenA >= lenB那么指针p由head开始向后移动lenA-lenB步。指针q=head2,接着p和q每次向后前进一步并比较p和q是否相等。如果相等就返回该结点。 否则两个链表没有交点代码实现:struct ListNode *getIntersectionNode(struct ListNode *headA, stru原创 2020-07-21 20:57:15 · 163 阅读 · 0 评论 -
【C++】智能指针(二)--unique_ptr、shared_ptr和wear_ptr
unique_ptr一、unique_ptr的引出我们知道auto_ptr通过复制构造或者通过赋值后,原来的auto_ptr对象就报废了。所有权转移到新的对象中去了。如果我们不想像auto_ptr那样不知不觉的就让原来的auto_ptr对象失效,这个时候就需要用到unique_ptr指针。二、unique_ptr的思想unique_ptr是 C++ 11 提供的用于防止内存泄漏的智能指针中的一种实现,独享被管理对象指针所有权的智能指针。unique_ptr对象包装一个原始指针,并负责其生命周期。当该原创 2020-07-20 20:16:45 · 266 阅读 · 0 评论 -
【C++】智能指针(一)---auto_ptr指针
智能指针的思想1、智能指针的引出在代码编写过程中,我们不可避免的带入一些bug,某个指针过期失效后,并没有及时将对应的内存释放,这样就造成了内存泄漏,如何避免类似问题的出现,除了代码编写过程中注意,其次可以通过智能指针帮我们做一些类似的工作。这就是智能指针的引出。2、智能指针的思想将基本类型指针封装为类对象指针(这个类肯定是个模板,以适应不同基本类型的需求),并在析构函数里编写delete语句删除指针指向的内存空间。智能指针的分类智能指针分为四种:1、auto_ptr(C++98)2、uni原创 2020-07-19 20:25:18 · 244 阅读 · 1 评论 -
C++中的设计模式之---工厂模式
工厂模式的分类1、核心功能:根据“需求”生产“产品”。不需要关注对象的生成过程。简化名称,便于使用。2、分类:实际上根据业务情景不同分为不同的实现方式。一般分3种:简单工厂模式(不属于23中模式中的一种)、工厂方法模式、抽象工厂模式。简单工厂模式1、核心思想:同一个“工厂”中生产多个“产品”。比如我们现在要得到苹果,香蕉,梨这三种水果。我们可以让他们在同一工厂中进行生产。只需要给他们对应得编号。1代表苹果,2代表香蕉,3代表梨。如下图所示:2、代码实现:class Fruit{public原创 2020-07-18 19:42:09 · 120 阅读 · 0 评论 -
用两个栈实现一个队列和用两个队列实现一个栈
用两个栈实现一个队列我们都知道栈的特点是”后进先出“,队列的特点是”先进先出“。两个栈实现一个队列也就是利用两个栈来实现队列的先进先出特点。思路:定义两个栈,stack1和stack2.将队列中的元素“abcd”压入stack1中,此时stack2为空;将stack1中的元素pop进stack2中,此时pop一下stack2中的元素,就可以达到和队列删除数据一样的顺序了;当stack2只pop了一个元素a时,satck1中可能还会插入元素e,这时如果将stack1中的元素e插入stack2中原创 2020-07-17 22:06:22 · 242 阅读 · 0 评论 -
【C++】内存池的实现
一、内存池概念内存池是一种自主的内存管理机制。就是将我们的内存管理放在了应用程序端。那么它的简单处理做了什么事呢?首先,我们从堆上分配出一块很大的内存块。接着我们按照划分将其划分成每个不同的小组。这个每个小组存储一个数据块。针对于每个小组的组内来说就是一个简单的数据结构。这个数据结构我们将其分为两个部分,这两部分代表分别存储数据的数据域和找到下一个指针的指针域。划分好之后我们用一个标志来标志它的起始位置。最后形成一个静态链表的组织方式,将第一个内存单元的指针域指向第二个内存单元。第二个内存单元指向下原创 2020-07-15 17:34:58 · 767 阅读 · 0 评论 -
【C++】C/C++之内存分布
一、基本知识C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。1、栈:就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。2、堆:就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉, 那么在程序结束后,操作系统会自动回收。3、自由存储区:就是那些由malloc等分配的内存块,他和堆是十分相似的, 不过它是用free来结束原创 2020-06-30 17:13:15 · 271 阅读 · 0 评论 -
【C++】string类的写时拷贝
深拷贝和浅拷贝1、深拷贝:资源只是简单的共享,会造成资源的浪费2、浅拷贝:多个对象拥有共同的资源。所谓的写时拷贝就是在写之前进行浅拷贝,在写的时候进行深拷贝。在最后一个对象销毁时才释放资源。那么为什么有了引用计数器以后为什么还有写时拷贝呢?因为当有两个String类s1,s2都是指向同一块空间“hello”,当想将s1修改成“hello”时,只想将s1指向的空间修改,而不想将s2修改,显然引用计数器不能解决这个问题,所以就有了写时拷贝。string类的写时拷贝#icnlude<iostr原创 2020-06-25 17:26:18 · 248 阅读 · 0 评论 -
【C++】运算符的重载
一、运算符的引出先看一段代码class CIntint main(){ int arr[] = {1,321}; int len = sizeof(arr)/sizeof(arr[0]); for(CInt i = 0; i < len; i++) { std::cout << arr[i] << " "; } std::cout << std::endl; return 0;}这段代码的第六行中的i < len比较的时候。我们原创 2020-06-18 16:14:02 · 172 阅读 · 0 评论 -
【C++】封装顺序表
一、封装顺序表的引出基础的数据结构有:顺序表、链表、栈、队列。这些数据结构我们都需要用到 ,但是在C语言中没有这样的库去供我们使用。但是C++中是有这样的库,也就是STL标准模板库中有一个组件是容器组件,容器组件中有一个顺序容器中的vector<int>就是来封装顺序表的。由于数组是定长的,所以在封装顺序表的时候我们用到了扩容机制:1、以倍数的形式开辟更大的空间2、旧数据拷贝到新的空间中3、旧空间释放4、指针指向新空间二、代码实现封装顺序表template<typenam原创 2020-05-28 17:06:30 · 440 阅读 · 0 评论 -
【C++】模板之函数模板
一、函数模板的引出1、如果现在要求写个代码实现两个数相加。我们一般的做法是:int Sum(int a, int b){ return a+b;}这段代码是有类型限制的,如果浮点数相加的话就得不到我们预期的结果。2、那我们怎么能写一段代码实现两个数相加并且和类型无关,任何类型都通用呢?(1)首先我们可以用宏处理#define Sum(a,b) a + bint main(){ int a = 10; int b = 20; int c = 0; c = Sum(a,b);原创 2020-05-25 17:40:40 · 448 阅读 · 0 评论 -
【C++】设计模式之单例模式
一、问题的提出单例模式是设计模式中最为简单,最为常见、最容易实现也是最应该掌握的模式。在基于对象的设计中我们可以通过一个全局变量来实现,在面向对象和面向过程结合的设计范式中,我们也还是通过一个全局变量实现这一点,但是当我们遇到了纯粹的面向对象的范式中,这一点只能通过单例魔术来实现了。简单得来说,单例模式是让一个类只能生成一个对象二、如何使用单例模式1、我们都知道对象的生成特点有两个:(1)开辟内存(2)调用构造函数那么怎么才能使一个类只生成一个对象呢?第一种思路:我们可以让构造函数只被调用原创 2020-05-18 16:56:33 · 131 阅读 · 0 评论 -
【C++】const和static修饰成员的情况
const1、const修饰成员变量class Test{public: Test(int a, int b): ma(a),mb(b)//初始化列表 { }private: const int ma;//声明常成员变量 int mb;};int main(){ return 0;}2、const修饰对象class Test{public: Test(int a, int b): ma(a),mb(b)//初始化列表 { } void Show()原创 2020-05-17 16:11:13 · 228 阅读 · 0 评论 -
【C++】分析代码中调用的四个默认函数和临时对象的生成
分析下面的代码每一行都有哪些对象生成调用了什么函数CGoods ggood1;static CGoods ggood2(10);int main(){ CGoods lgood1(10); static CGoods lgood2("car2", 10000, 10); CGoods lgood3 = CGoods(20); CGoods lgood4 = 20; lgood1 = 20; lgood3 = CGoods(20); lgood4 = (CGoods)(1, 31, 2原创 2020-05-15 12:08:37 · 167 阅读 · 0 评论 -
【Linux】拷贝构造函数和赋值运算符重载函数
拷贝构造函数一、作用拷贝构造函数函数是将已存在对象生成相同类型的新对象。二、原型拷贝构造函数形参一定要有引用。有两个原因:避免递归构造的形参对象发生栈溢出节省对象销毁的开销class CGoods{public: CGoods()//构造函数 { mname = new char[1](); std::cout << "CGoods::CGoods()" << std::endl; } CGoods(float price) { mname原创 2020-05-14 15:49:44 · 176 阅读 · 0 评论 -
【C++】this指针
一、C++中的this指针先看一段代码class Student{public: void eat(char* _what) { std::cout << mname << " is eatting " << _what << std::endl; } void sleep(char* _where) { std::cout << mname << " is sleeping at " << _原创 2020-05-11 16:27:49 · 317 阅读 · 0 评论 -
【C++】oop(面向对象)思想
我们都知道C语言是面向过程的语言,C++是半面向对象的语言。C语言中要实现一个功能的话就得将功能拆分成一个一个小的模板,模块中实现功能的时候是通过函数实现的,这就是所谓的模块化语言,它会形成函数调用链,然后最终形成最后的功能。C++是面向对象的语言,那它到底是怎样实现的呢?第一个就是所谓的oop思想一、oop思想1、计算机语言的设计目的和意义模拟现实。通过计算机语言实现现实中的问题2、oop思想用图表示为:opp思想简单来说就是将属性和行为结合起来二、代码实现计算机与现实世界的转换例如:原创 2020-05-10 14:57:45 · 1071 阅读 · 0 评论 -
【C++】namspace和using指示符的简单使用
namespace一、namspace机制提出的意义1、C中的作用域我们都知道C中的作用域有两个:(1)全局作用域(2)局部作用域那么它们是如何实现的呢?假设现在有一个项目,这个项目有很多人一起去实现,那这个项目下可能有很多的源文件。比如A现在写的源文件为:int Sort(int arr[],int len);//升序排序,快排B同学所写的源文件为:int Sort(int arr[],int len);//降序排序,堆排序C同学所写的源文件为:int Sort(int ar原创 2020-05-09 12:09:00 · 298 阅读 · 0 评论 -
【C++】malloc/free和new/delete
malloc/free一、C中malloc的使用在C中我们动态开辟内存的时候用的是malloc函数,回收时用的是free函数。1、在C中我们一般的使用形式是这样的:int *p = (int*)malloc(sizeof(int));这里面存在两个问题:(1)、sizeof(int)计算的是什么?sizeof计算的是一个类型单元的大小(2)、malloc之后为什么要用(int*)强转呢?要解决这个问题,我们首先要了解malloc的原型void* malloc(size_t size);原创 2020-05-08 20:33:32 · 220 阅读 · 0 评论 -
【C++】继承与多态之虚函数
一、定义虚函数必须是基类的非静态成员函数,其访问权限可以是private或protected或public,在基类的类定义中定义虚函数的一般形式。虚函数是一种在基类定义为virtual的函数,并在一个或多个派生类中再定义的函数。实现多态性。虚函数的特点是,只要定义一个基类的指针,就可以指向派生类的对象。二、具体实现我们先看一段简单的代码:#include <iostream>...原创 2020-04-09 16:18:33 · 191 阅读 · 0 评论 -
【C++】基类中的数据通过不同的继承方式来继承在派生类中的访问限定
1、派生类的公有数据访问基类中的公有数据类外访问如果能在类外访问代表以公有继承继承的基类公有的数据在派生类中的公有下放着。先看一段代码:#include <iostream>using namespace std;class A{public: A(int a = 0, int b = 0,int c = 0) :ma(a), mb(b), mc(c){}publi...原创 2020-04-08 13:04:01 · 283 阅读 · 0 评论 -
C与C++的相互调用
我们经常再写代码时会使用C与C++混合编程,但是在调用对方接口时我们为了避免出现问题会使用extern “C”。1、出现的问题在C++中,为了支持重载机制,在编译时,要对函数的名字进行一些处理,比如加入函数的返回类型等来加以区别;这也就是C++中的函数命名规则。如函数int sum(int a,int b)在编译过程中会生成 ?sum@@YAHHH@Z这样的符号,这也是C++可以实现重载的原因...原创 2020-04-07 12:29:27 · 394 阅读 · 0 评论 -
强弱符号规则
一、二者的区别”强弱符号关系“也就是我们平时说的定义与声明的关系。1、强符号:也就是函数定义。是初始化了的全局变量。2、弱符号:也就是函数声明。是未初始化的全局变量。二、二者之间的规则1、不允许强符号被多次定义(即不同的目标文件中不能有同名的强符号)。但允许弱符号出现多次。可以对全局变量和函数进行重复声明,因为声明是弱符号。2、如果一个符号再某个目标文件中是强符号,在其他文件中是弱符号...原创 2020-04-02 21:06:17 · 2023 阅读 · 0 评论 -
【C++】函数的堆栈调用过程
一、栈和栈帧的含义在讲函数的堆栈调用之前,我们应该先了解一下栈和栈帧的含义栈:我们都知道在虚拟地址空间上有一块栈区,它主要是给函数提供区域。也就是说栈是所有函数的活动空间。栈帧:一个函数的活动空间二、Linux和windows下汇编的区别1、Linux AT&T int a = 10;mov 0a dword ptr[a]2、Windows inter x86mov dwo...原创 2020-03-20 19:03:29 · 369 阅读 · 0 评论 -
C++中的inline函数
**1、inline函数的处理流程:**在函数的调用点直接进行代码的替换。2、inline函数和普通函数的区别:(1)普通函数有函数的堆栈和清栈。(2)inline函数由于代码的直接展开,所以没有堆栈和清栈,效率会更高。3、inline函数和宏的区别:(1)宏在预编译阶段,没有类型和安全检查。(2)inline函数在编译阶段,有类型和安全检查。inline可以说是一种更安全的宏。4、...原创 2020-03-13 22:29:35 · 172 阅读 · 0 评论