
C++
Noone0^
欲渡黄河冰塞川,将登太行雪满山。
展开
-
排序算法(插入、选择、交换、归并)
八大排序算法1.排序的概念2.算法分析3.具体排序讲解3.1直接插入排序3.2希尔排序1.排序的概念排序是计算机内经常进行的一种操作,其目的是将一组“无序”的记录序列调整为“有序”的记录序列。排序分为内部排序和外部排序。若整个排序过程不需要访问外存便能完成,则称此类排序问题为内部排序。反之,若参加排序的记录数量很大,整个序列的排序过程不可能在内存中完成,则称此类排序问题为外部排序。2.算法分析插入排序直接插入排序将第一个和第二个元素排好序,然后将第3个元素插入到已经排好序的元素中,原创 2020-12-14 15:06:54 · 1993 阅读 · 0 评论 -
STL中的greater<T>()和less<T>()
在构造map、set、multimap、multiset这些序列式容器时,默认按照key值来进行排序,比较器默认从小到大。在构造时加上greater<T> 会让容器的比较器按照key值从大到小排序,less<T>则相反。#include<iostream>#include<map>#include<functional>using namespace std;int main() { map<int, string,greater原创 2020-12-14 09:34:28 · 623 阅读 · 0 评论 -
[链表]LeetCode206. 反转链表
LeetCode206. 反转链表思路:使用双指针,一个指向当前节点cur,另一个指向当前节点的前一个节点prev。需要保存一下当前节点的下一个节点curnext(因为当前节点会变)。然后让当前节点指向他的上一个节点,再将prev和cur向后移动。当cur==nullptr说明走到链表尾,结束。迭代法://迭代法:class Solution {public: ListNode* reverseList(ListNode* head) { ListNode* prev=n原创 2020-09-06 21:10:55 · 118 阅读 · 0 评论 -
AVL树及其模拟实现
AVL树及其模拟实现1.AVL树的概念2.AVL树节点的定义3.AVL树的插入1.AVL树的概念二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下。因此,两位俄罗斯的数学家G.M.Adelson-Velskii和E.M.Landis在1962年发明了一种解决上述问题的方法:当向二叉搜索树中插入新结点后,如果能保证每个结点的左右子树高度之差的绝对值不超过1(需要对树中的结点进行调整),即可降低树的高度,从而减少平均搜索长度。一棵AV原创 2020-09-02 18:27:21 · 305 阅读 · 0 评论 -
malloc/calloc/realloc函数的区别及用法
malloc/calloc/realloc函数的区别及用法1.malloc函数2.calloc函数3.realloc函数malloc/calloc/realloc函数都是分配内存,但是也存在一定的差异。1.malloc函数malloc函数文档函数原型:void* malloc (size_t size);**返回值:**成功时指向由函数分配的内存块指针,此指针的类型总是void*,该数据指针可以转换为所需类型的数据指针(如下例的int类型),以便可以解除引用。如果函数未能分配请求的内存块,则空指针原创 2020-07-25 19:54:54 · 461 阅读 · 0 评论 -
二叉搜索树及其模拟实现
二叉搜索树1.二叉搜索树1.1二叉搜索树的概念1.2二叉搜索树操作在对map/multimap/set/multiset进行了简单的了解后,会发现这几个容器有个共同点是:其底层都是按照二叉搜索树来实现的。那什么是二叉搜索树?其底层是二叉搜索树吗?1.二叉搜索树1.1二叉搜索树的概念二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:若它的左子树不为空,则左子树上所有节点的值都小于根节点的值若它的右子树不为空,则右子树上所有节点的值都大于根节点的值它的左右子树也分别为二叉搜原创 2020-07-22 18:28:40 · 179 阅读 · 0 评论 -
STL关联式容器之set&multiset
set1.set的介绍set是按照一定次序存储元素的容器在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。set中的元素不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们。在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序。set容器通过key访问单个元素的速度通常比uno...原创 2020-07-17 17:20:35 · 216 阅读 · 0 评论 -
STL之关联式容器
STL之关联式容器1.关联式容器2.键对值3.树形结构的关联式容器1.关联式容器在接触容器初,我们学习了STL中的部分容器,如:vector,list,deque…等,这些容器统一称为序列式容器。因为其底层为线性序列的的数据结构,里面储存的是元素本身。关联式容器就有所不同关联式容器也是用来存储与序列式容器不同的是,里面存储的是<key, value>结构的键值对,在数据检索时比序...原创 2020-07-16 17:04:10 · 179 阅读 · 0 评论 -
C++中的智能指针
C++中的智能指针1.为什么要使用智能指针?2.智能指针的使用及其原理2.1RAII2.2智能指针的使用及原理3.C++中常见的智能指针3.1auto_ptr3.1.1 auto_ptr的实现原理3.1.1auto_ptr的缺陷:3.2unique_ptr3.3shared_ptr3.3.1shared_ptr中的循环引用的问题1.为什么要使用智能指针?先来看一段代码,分析这段代码有没有内存上的错误?#include <iostream>using namespace std;void原创 2020-07-15 17:29:43 · 616 阅读 · 0 评论 -
C++多态的原理(虚函数指针和虚函数表)
C++多态的原理 (虚函数指针和虚函数表)1.虚函数指针和虚函数表2.继承中的虚函数表2.1单继承中的虚函数表2.2多继承中的虚函数表3.多态的原理4.总结1.虚函数指针和虚函数表以下代码:问类实例化出的对象占几个字节?#include<iostream>using namespace std;class A { int m_a;public: void func() { cout << "调用类A的func()函数" << endl; }};原创 2020-07-09 17:40:45 · 1230 阅读 · 0 评论 -
C++中的多态
C++多态1.多态的概念2.多态的定义即实现2.1多态定义的构成条件2.2什么是虚函数2.3虚函数的重写2.4虚函数重写的两个例外1.多态的概念在面向对象语言中,接口的多种不同实现方式即为多态。具体来说就是去完成某个行为,当调用不同的对象去完成时会产生不同的状态。例如:在车站买票这个行为,学生去购买学生票就是半价;普通人去买票则是全价。2.多态的定义即实现2.1多态定义的构成条件多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了Person。Person对象原创 2020-07-04 21:57:35 · 231 阅读 · 0 评论 -
C++中的继承
C++中的继承1.继承的概念及定义1.1继承的概念1.2继承的定义1.继承的概念及定义1.1继承的概念继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。 继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。#include<iostream>#include<string>using na原创 2020-06-29 18:37:24 · 182 阅读 · 0 评论 -
C++的IO流
C++的IO流1. C语言的输入与输出2.C++的IO流2.1流是什么2.2C++IO流3.文件操作3.1文本文件3.1.1写文件3.1.2读文件3.2二进制文件3.2.1二进制写文件3.2.2二进制读文件1. C语言的输入与输出C语言中我们用到的最频繁的输入输出方式就是scanf ()与printf()。 scanf(): 从标准输入设备(键盘)读取数据,并将值存放在变量中。printf(): 将指定的文字/字符串输出到标准输出设备(屏幕)。注意宽度输出和精度输出控制。C语言借助了相应的缓冲区来进行输原创 2020-06-20 14:57:13 · 232 阅读 · 0 评论 -
C++模板进阶(非类型模板参数和模板特化)
C++模板进阶1.非类型模板参数1.非类型模板参数模板参数分为类类型形参和非类型形参。类类型参:出现在模板参数列表中,跟在class或者typename之后的参数类型名称,比如int,char,string等,也可以是自己实现的自定义类型。非类型参: 就是用一个常量作为模板(类模板和函数模板)的一个参数,在模板中可将该参数当成常量来使用。...原创 2020-06-20 11:30:43 · 892 阅读 · 0 评论 -
C++函数模板的显式具体化
C++函数模板的显示具体化1.函数模板的局限性2.显式具体化1.函数模板的局限性在C++中,我们可以使用函数模板来增加代码的复用性,但是并不是所有的类型都可以调用函数函数模板来处理,如数组和结构体数据类型。这就是函数模板的局限性。struct job{ char name[10]; double salary; int floor;}//交换两个这种结构的内容,原来的模板使用以下代码进行交换: temp=a; a=b; b=temp;由于C++允许将一个结构赋给另一个结构,因此即使原创 2020-06-18 15:49:24 · 1010 阅读 · 0 评论 -
STL容器适配器stack/queue/priority_queue的介绍与使用
STL容器适配器之stack的介绍与使用1.stack的介绍2.stack的使用1.stack的介绍stack的文档介绍stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底的,元素特定容器的尾部(即栈顶)被压入和弹出。stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些容器类原创 2020-06-15 16:18:29 · 301 阅读 · 0 评论 -
STL容器之deque的介绍与使用
这里写目录标题deque的介绍2.deque的使用2.1deque的定义2.2deque的常见构造deque的介绍deque是双端队列不规则的首字母缩写,双端队列是动态大小的序列式容器,其可以像两端进行伸缩。特定的库可以以不同的方式实现deque,但通常都是一种动态数组。不论在何种情况下,它都允许通过随机访问迭代器直接访问单个元素,可以根据需要动态的伸缩。因此,deque提供了一些与vector相似的功能,但deque在头部和尾部进行数据插入和删除操作更加高效。与vector不同的是,deque原创 2020-06-14 18:41:12 · 304 阅读 · 0 评论 -
STL容器之list的介绍与使用
STL容器之list的介绍与使用1.list的介绍2.list的使用2.1list的定义2.2list的常见构造2.3list iterator的使用2.4list的容量操作1.list的介绍cplusplus中对list的介绍list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。list与forward_list非常相似:最主要的不同原创 2020-06-12 14:57:56 · 236 阅读 · 0 评论 -
STL容器之vector的介绍与使用
STL容器之vector的介绍与使用1.vector的介绍2.vector的使用2.1vector的定义2.2vector的常见构造2.3vector iterator的使用(vector迭代器)2.3vector的容量操作2.4vector增删改查1.vector的介绍cplusplus中对vector的介绍vector是表示可变大小数组的序列容器。就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它原创 2020-06-09 15:41:25 · 302 阅读 · 0 评论 -
STL标准模板库
STL标准模板库简介1.什么是STL2.STL的组成部分2.1容器(containers)2.1.1序列式容器2.2.2适配器容器2.2.3关联式容器2.2迭代器(iterators)2.3算法(algorithms)1.什么是STLSTL(standard template libaray-标准模板库),它是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室工作时所开发出来的。从根本上说,STL是一些“容器”的集合,这些“容器”有list,vector,原创 2020-06-07 15:06:50 · 284 阅读 · 0 评论 -
C++中常见的string类题目
C++中常见的string类题目翻转字符串字符串中的第一个唯一字符计算字符串最后一个单词的长度一级目录一级目录翻转字符串leetcode344题: 翻转字符串思路: 双指针,交换头尾两个指针所指的两个位置的值,指针向中间移动一个位置。重复以上操作,直到两个指针指向同一位置。class Solution {public: void reverseString(vector<char>& s) { if(s.empty()) return;原创 2020-06-06 14:39:45 · 760 阅读 · 0 评论 -
C++中的string类及常用接口说明
C++中的string类及常用接口说明1.string类的介绍2.string类的常用接口说明2.1常见构造2.2容量操作2.3访问操作2.4修改操作2.5string类非成员函数3.实现string类及其常用接口1.string类的介绍Cplusplus中对于string类的介绍 戳这里翻译:字符串是表示字符序列的类标准的字符串类提供了对此类对象的支持,其接口类似于标准字符容器的接口,但添加了专门用于操作单字节字符字符串的设计特性。string类是使用char(即作为它的字符类型,使用它原创 2020-05-27 13:15:48 · 861 阅读 · 0 评论 -
C++单例模式介绍
C++单例模式1.C++中的设计模式2.单例模式2.1什么是单例模式2.2C++中单例模式的实现2.3懒汉模式2.3.1多线程下的懒汉模式1.C++中的设计模式设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。使用设计模式的目的:为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。设计模式使代码编写真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。2.单例模式2.1什么是单例模式一个类只能创建一个对象,即单例模式,该模式可以保原创 2020-05-17 17:32:37 · 358 阅读 · 0 评论 -
C++实现一个只能在堆/栈上创建对象的类
C++实现一个只能在堆/栈上创建对象的类1.C++中类对象的创建2.设计一个类,该类只能在堆上创建对象3.设计一个类,该类只能在堆上创建对象1.C++中类对象的创建在C++中,类的对象创建可以静态创建在栈区, 如A a;还可以动态创建在堆区,如A* ptr=new A;这两种方式是不同的。静态建立一个类的对象,是由编译器为对象在栈空间中分配内存,是通过直接移动栈顶指针,挪出适当的空间,然后在这片内存空间上调用构造函数形成一个栈对象。使用这种方法,直接调用类的构造函数。动态建立类对象,是使用new运算原创 2020-05-16 15:37:10 · 1243 阅读 · 0 评论 -
C/C++内存管理&new/delete操作
C/C++内存管理&new/delete操作1. C/C++内存分布2.C++内存管理方式2.1new/delete操作2.2.1new/delete操作内置类型2.1.2new/delete操作自定义类型3. operator new与operator delete函数4.new/delete的实现原理4.1内置类型4.2自定义类型5.定位new表达式(placement-new)6.malloc/free和new/delete的区别7.设计一个类,该类只能在堆上创建对象8.设计一个类,该类只能在原创 2020-05-15 19:02:21 · 403 阅读 · 2 评论 -
C/C++中的内存管理
C/C++内存管理&new/delete操作1.C/C++内存分区模型2.程序运行前2.1代码区(代码段)2.2数据段(静态区/全局区)3.程序运行后3.1栈区1.C/C++内存分区模型C++程序在执行时,会将程序大方向分为四个区域:代码区,全局区,堆区,栈区。2.程序运行前在程序编译后,生成了exe可执行文件,未执行该程序前分为两个区域。2.1代码区(代码段)存放常量和程序代码(二进制代码)的区域。1.代码区是共享的,共享的目的是对于频繁被执行的程序,只需要在内存中有一份代码即可。原创 2020-05-14 15:17:28 · 265 阅读 · 1 评论 -
C++类与对象(下)
C++类与对象(下)1.static成员1.1概念1.2特性2.C++11 的成员初始化新玩法3.explicit关键字4.友元4.1友元函数4.2友元类4.2.1概念4.2内部类4.2.1特性5.理解封装1.static成员1.1概念声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量;用static修饰的成员函数,称之为静态成员函数。静态的成员变量一定要在类外进行初始化。1.2特性静态成员变量必须在类外定义,定义时不添加static关键字。类的静态成原创 2020-05-13 14:52:39 · 242 阅读 · 0 评论 -
STL关联式容器之map&multimap
STL关联式容器之map&multimap1.map1.1 map的介绍1.2 pair创建键对值1.3 map的使用1.3.1 map的模板参数说明1.3.2 map的构造1.3.3 map的迭代器1.map1.1 map的介绍map是关联容器,它按照特定的次序(按照key来比较)存储由键值key和值value组合而成的元素。在map中,键值key通常用于排序和惟一地标识元素...原创 2020-04-02 13:40:10 · 172 阅读 · 0 评论 -
C++模板初阶
C++中的另一种编程思想成为泛型编程(编写与类型无关的通用代码,是代码复用的一种手段),主要利用的技术就是模板。C++中提供两种模板机制:函数模板和类模板函数模板1.函数模板的概念:函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。2.函数模板的格式:template<typename T1,typename T2,typen...原创 2020-03-10 00:34:21 · 230 阅读 · 0 评论 -
C++ 类的六个默认成员函数
1.类的六个默认成员函数如果一个类中什么成员都没有,简称为空类。空类中什么都没有吗?并不是的,任何一个类在我们不写的情况下,都会自动生成下面6个默认成员函数:构造函数,析构函数,拷贝构造函数,赋值重载函数,取地址重载函数。2.构造函数2.1构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,保证每个数据成员都有 一个合适的初始值,并且在对象的生命周期内只调用一次。...原创 2019-08-26 15:47:46 · 213 阅读 · 0 评论 -
C++类与对象(上)
1.的认识C++是基于面向对象的,关注的是对象。C语言中 ,结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数。Struct Student{ public: void SetStudentInfo(const char* name, const char* gender, int age) {// //C语言中 ,结构体中只能定义变量,在C++中,结构体...原创 2019-08-22 15:00:34 · 191 阅读 · 0 评论 -
C++入门
1.C++中的关键字关键字---->语句----->实现算法逻辑。2.命名空间在C++中变量和类都是大部分存在的,这些变量、函数和类的名称都存在与全局作用域中,可能会导致很多冲突,使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染。 namespace关键字的出现就是针对这种问题的。2.1命名空间的定义命名空间的定义,需要使用到namespace关键字,后...原创 2019-04-26 14:27:07 · 388 阅读 · 0 评论