![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
c++学习之路
阳光丿洒脱
死亡不是终点,遗忘才是。
展开
-
详解STL中的空间配置器(SGI版本)
空间配置器1.什么是空间配置器为各个容器高效的管理空间(空间的申请与回收)的2.为什么需要空间配置器各种容器----->可以存放元素---->底层需要空间new 申请空间operator new ---->malloc调用构造函数------完成对象的构造动态内存管理总结前面的容器中,每次开辟空间都用的是new,但是用new有一些不好的地方空间申请与释放...原创 2020-01-15 11:26:08 · 881 阅读 · 1 评论 -
C++中的lambda表达式和线程库
98中的一个例子如果想要对一个数据集合中的元素进行排序,可以使用std::sort方法#include <algorithm>#include <functional>int main(){ int array[] = {4,1,8,5,3,7,0,9,2,6}; // 默认按照小于比较,排出来结果是升序 std::sort(array, array+siz...原创 2020-01-14 16:05:45 · 968 阅读 · 0 评论 -
详解C++中右值引用
98中的引用概念特性引用的使用场景三种传参方式效率的比较探索:引用的底层实现方式----->指针T&------>T* constconst T&---->const T*const引用和指针的区别引用的总结11中的右值引用为什么要有右值引用为了提高程序运行效率,C++11中引入了右值引用,右值引用也是别名,但其只能对右值引用i...原创 2020-01-14 11:35:52 · 5436 阅读 · 3 评论 -
C++11新特性的总结
C++11新特性auto关键字(C++11)基于范围的for循环(C++11). 指针空值nullptr(C++11)C++动态内存管理序列式容器 array forward_list;继承和多态:final overridedelete:不生成默认的成员函数default:强制编译器生成默认的成员函数智能指针:unique_ptr,shared_ptr,weak_ptr哈希结...原创 2020-01-13 12:31:38 · 200 阅读 · 0 评论 -
海量数据处理(位图和布隆过滤器)
哈希切割给一个超过100G大小的log file, log中存着IP地址, 设计算法找到出现次数最多的IP地址? 与上题条件相同,如何找到top K的IP?如何直接用Linux系统命令实现解决思路找到出现次数最多的IP地址要找到前TopK的IP地址,就是要统计每个IP地址出现多少次分割大文件:如果能将相同IP地址放到同一个文件中哈希分割: 从源文件中获取一个IP地址---->I...原创 2020-01-13 11:13:27 · 487 阅读 · 0 评论 -
哈希的概念及其操作
哈希概念顺序结构以及平衡树中,元素关键码与其存储位置之间没有对应的关系,因此在查找一个元素时,必须要经过关键码的多次比较。顺序查找时间复杂度为O(N),平衡树中为树的高度,即O( Log2N),搜索的效率取决于搜索过程中元素的比较次数。理想的搜索方法:可以不经过任何比较,一次直接从表中得到要搜索的元素。 如果构造一种存储结构,通过某种函数(hashFunc)使元素的存储位置与它的关键码之间能够...原创 2019-12-08 19:03:03 · 1055 阅读 · 0 评论 -
模拟实现STL中map和set容器
红黑树的迭代器//红黑树的迭代器template<class T>struct RBTreeIterator{ typedef RBTreeNode<T>Node; typedef RBTreeIterator<T> Self;public: RBTreeIterator(Node* pNode = nullptr) :_pNode(pNod...原创 2019-12-04 13:26:04 · 145 阅读 · 0 评论 -
红黑树概念及其相关操作的实现
红黑树的概念红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。 通过 对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的。最长路径中结点的个数不会超过最短路径中结点个数的两倍红黑树的性质每个结点不是红色就是黑色根节点是黑色的如果一个节点是红色的,则它的两个孩子结点是黑色的对于...原创 2019-12-01 18:59:51 · 201 阅读 · 0 评论 -
c++中的异常处理
c语言处理错误的方式传统的错误处理机制终止程序,如assert,缺陷:用户难以接受。如发生内存错误。返回错误码,缺陷:需要程序员自己查找对应的错误。如系统的很多库接口函数都是通过把错误码放到errno中,表示错误其他方式c++中的异常处理异常是一种处理错误的方式,当一个函数发现自己无法处理的错误时就可以抛出异常,让函数的直接或间接的调用者处理这个错误。throw: 当问题出现时...原创 2019-11-30 11:09:51 · 315 阅读 · 0 评论 -
再谈c++中的继承
继承的概念继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。class Person{public: void Print() { cout &l...原创 2019-11-29 17:20:37 · 143 阅读 · 0 评论 -
再谈c++中的多态
何为多态多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。多态的实现在继承的体系下基类中必须有虚函数(被virtual关键字修饰的成员函数),在派生类中必须要对基类中的虚函数进行重写对于虚函数的调用:必须使用基类的指针或者引用调用虚函数体现多态性在代码运行时,基类指针指向哪个类的对象,就调用哪个类的虚函数class Perso...原创 2019-11-28 13:20:15 · 186 阅读 · 0 评论 -
c++中的IO流
c语言中的IO操作标准类型的输入输出:输入------>数据来源是通过键盘进行输入输出------>程序中的数据输出到控制台c语言中:scanf:输入printf:输出两个函数的相同点1 —格式串2 —不定参数两个函数的缺陷1 —用户要提供数据的格式—用户要记忆大量的格式串—而且容易出错2 —两个函数参数检测不严格getchar()put...原创 2019-11-17 11:34:24 · 217 阅读 · 0 评论 -
深入理解c++中的函数模板
非类型模板参数模板参数分类类型形参与非类型形参。类型形参:出现在模板参数列表中,跟在class或者typename之类的参数类型名称。非类型形参,就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用。namespace bite{ template<class T, size_t N> class array { public: ...原创 2019-11-16 20:47:23 · 453 阅读 · 0 评论 -
初识c++中的函数模板
函数模板函数模板概念函数模板:编译器生成代码的一个规则。函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。函数模板格式//要让这个函数与类型无关//Add函数模板template<class T,typename s> //模板的参数列表//告诉编译器T是一种类型T Add(T left, T right){ r...原创 2019-11-14 09:23:59 · 134 阅读 · 0 评论 -
c++实现日期类
实现我们可以很快知道,一个日期有年月日,我们可以很快的写出以下代码class Date{public: Date(int year, int month, int day) :_year(year) , _month(month) , _day(day) {}private: int _year; int _month; int _day;};但是我们这个日...原创 2019-11-09 11:47:33 · 405 阅读 · 0 评论 -
c++动态内存管理题目
malloc/free和new/delete的区别malloc/free和new/delete的共同点是:都是从堆上申请空间,并且需要用户手动释放。不同的地方是:malloc和free是函数,new和delete是操作符malloc申请的空间不会初始化,new可以初始化malloc申请空间时,需要手动计算空间大小并传递,new只需在其后跟上空间的类型即可malloc的返回值为void*...原创 2019-11-07 17:32:25 · 325 阅读 · 0 评论 -
c++动态内存管理
c/c++内存分布 int globalVar = 1; static int staticGlobalVar = 1; void Test() { static int staticVar = 1; int localVar = 1; int num1[10] = {1, 2, 3, 4}; char char2[] = "abcd"; ...原创 2019-11-07 17:06:59 · 365 阅读 · 0 评论 -
模拟实现priority_queue优先级队列
优先级队列无参构造priority_queue() :c() {}区间构造区间构造需要用到迭代器,而迭代器每个容器的类型不一样,所以用模板给出,初始化列表,把用户给进来的元素空间起始位置,放到优先级队列中底层空间的位置,然后进行调整,把它调整成一个堆template<class Iterator> priority_queue(Iterator first, ...原创 2019-11-06 16:40:09 · 261 阅读 · 0 评论 -
c++中容器适配器
什么是容器适配器适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结),该中模式是将一个类的接口转换成客户希望的另外一个接口。stack模拟封装template<class T,class Container = deque<T>> class stack { public: stack() {} vo...原创 2019-11-06 14:52:22 · 337 阅读 · 1 评论 -
详解优先级队列priority_queue(应用+模拟实现)
优先级队列的概念优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的此上下文类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶部的元 素)。优先队列被实现为容器适配器,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特 定的成员函数来访问其元素。元素从特定容器的“尾部”弹出,其称为优先队列的顶部。底层容器可以是任...原创 2019-11-06 14:14:31 · 787 阅读 · 0 评论 -
复习栈和队列,详解最小栈,栈的弹出压入序列,逆波兰表达式求值
栈和队列的概念栈:吃进去吐出来对列:吃进去拉出来数据结构中的栈和内存中的区别数据结构中的栈具有后进先出的特性,而内存中的栈是一个内存空间,只不过这个内存空间具与数据结构的栈具有相同的特性。栈和队列操作栈和队列基本操作栈操作栈中没有迭代器,因为不需要遍历元素。最小栈栈里面肯定有,push/pop/top操作,而且三个操作的时间复杂度是---->O(1)我们要添加一个操作...原创 2019-11-02 22:17:22 · 189 阅读 · 0 评论 -
vector和list容器有哪些区别
这个问题的本质还是在问顺序表和链表的区别底层结构不同vector容器list容器一段连续的空间带头结点的双向循环链表元素访问方式vector容器list容器支持随机访问—O(1)不支持随机访问—O(N)需要扩容不需要扩容任意位置插入元素----O(N)–搬移元素O(1)迭代器不同vector容器list容器...原创 2019-10-31 15:41:30 · 595 阅读 · 0 评论 -
详解list容器(应用+模拟实现)
list容器带头结点的双向循环链表list操作list容器的概念及其操作构造和销毁 list<int>L1; list<int>L2(10, 5); vector<int>v{ 1, 2, 3, 4, 5, 6, 7, 8, 9 }; list<int>L3(v.begin(), v.end()); list<int>...原创 2019-10-30 22:01:21 · 684 阅读 · 0 评论 -
详解vector容器(应用+模拟实现,vector相关练习题)
vector容器动态的顺序表,数组。vector操作vector操作及其概念构造 vector<int>v1; vector<int>v2(10, 5); vector<int>v3(v2); int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 }; vector<int>v4(array,...原创 2019-10-28 22:02:27 · 1780 阅读 · 0 评论 -
浅拷贝+引用计数--写时拷贝---模拟实现string容器
引用计数深拷贝多个对象共享同一份资源时,最后能够保证该资源只被释放一次应该由哪个对象释放资源?由最后一个使用该资源的对象去释放怎么知道一个对象是最后一个使用该资源的对象?给一个计数,记录使用该资源对象的个数实现计数用普通整型先来看一个例子class string{public: string(char *str = "") { //如果指针为空,则初始化位空字符串...原创 2019-10-26 22:20:47 · 681 阅读 · 0 评论 -
详解string容器(应用+模拟实现,string练习题)
为什么要有string容器string:其实就是一个字符串,c++对字符串进行了封装的,封装到一个类里面,这样用户就不用担心开辟空间的问题,只需要往string类里放字符串就可以了,string其实还可以自增长很多人就会有一个疑问,以前在c语言中,已经有字符串了,其实c语言中表示字符串就是char*,也就是字符数组+'\0'string应用string类常用接口构造 string s...原创 2019-10-26 18:16:28 · 540 阅读 · 0 评论 -
详解 二叉搜索树-----AVL树
二叉搜索树根结点比左子树中所有结点都大根结点比右子树所有结点都小最小的元素在最左侧最大的元素在最右侧中序遍历有序具有以上的特征的二叉树就是二叉搜索树也叫二叉排序数二叉搜索树的操作查找插入树为空,则直接插入树不空,按二叉搜索树性质查找插入位置,插入新节点删除首先查找元素是否在二叉搜索树中,如果不存在,则返回, 否则要删除的结点可能分下面四种情况:要删除的结...原创 2019-10-15 17:32:07 · 702 阅读 · 0 评论 -
关联式容器(map,set,multimap,multiset)
关联式概念STL中的部分容器,比如:vector、list、deque、forward_list(C++11)等,这 些容器统称为序列式容器,因为其底层为线性序列的数据结构,里面存储的是元素本身。关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是<key, value>结构的键值对,在数据检索时比序列式容器效率更高。二叉搜索平衡结构:关于key有序的序列,时...原创 2019-10-12 16:50:03 · 189 阅读 · 0 评论 -
c++中STL实现演讲比赛流程
演讲比赛流程1)某市举行一场演讲比赛,共有 24 个人参加,按参加顺序设置参赛号。比赛共三轮,前两 轮为淘汰赛,第三轮为决赛。2)比赛方式:分组比赛第一轮分为 4 个小组,根据参赛号顺序依次划分,比如 100-105 为一组,106-111 为第 二组,依次类推,每组 6 个人,每人分别按参赛号顺序演讲。当小组演讲完后,淘汰组内排 名最后的三个选手,然后继续下一个小组的比赛。第二轮分为 ...原创 2019-08-07 11:53:20 · 432 阅读 · 0 评论 -
c++中的STL的常用算法---3(排序算法,拷贝和替换算法,算术生成算法,集合算法)
排序算法merge()以下是排序和通用算法:提供元素排序策略merge: 合并两个有序序列,存放到另一个序列。#include<iostream>using namespace std;#include<algorithm>#include<vector>void test01(){ vector<int >v1; ...原创 2019-08-07 10:11:32 · 153 阅读 · 0 评论 -
c++实现贪吃蛇
游戏中的实现元素游戏中元素分为:墙壁,蛇,事物以及蛇的可行区域和右侧的版本号和游戏玩法提示墙壁*号表示,代表一个区域范围,也就是蛇的可移动区域,蛇如果碰到墙壁视为死亡,蛇分为蛇头,蛇身,蛇头用@符号表示,蛇身用=等号表示,当蛇吃到食物时候,蛇身+1,一意为着长度变长,贪吃蛇可以通过不断地吃食物来增加自己的身体食物#井号表示,蛇碰到食物会将食物吃掉可移动区域空格 表示,代表蛇可以移...原创 2019-08-08 18:30:36 · 54345 阅读 · 24 评论 -
c++中的异常---2(异常接口声明,异常变量的生命周期,异常的多态使用)
异常接口声明为了加强程序的可读性,可以在函数声明中列出可能抛出异常的所有类型,例如:void func() throw(A,B,C);这个函数func能够且只能抛出类型A,B,C及其子类的异常如果在函数声明中没有包含异常接口声明,则此函数可以抛任何类型的异常,例如:void func()一个不抛任何类型异常的函数声明为:void func() throw()如果一个函数抛出了它的异常接口...原创 2019-07-28 17:54:44 · 300 阅读 · 1 评论 -
c++中的函数适配器
函数适配器函数适配器概念STL中定义了大量的函数对象,但是有时候需要对函数返回值进行进一步的简单计算,或者填上多余的参数,不能直接代入算法,函数适配器实现了这一功能,将一种函数对象转化为另一种符合要求的函数对象,函数适配器可以分为4大类,绑定适配器,组合适配器,指针函数适配器和成员函数适配器直接构造STL中的函数适配器通常会导致冗长的类型声明。为简化安徽念书适配器的构造,STL还提供了函数...原创 2019-08-05 15:15:22 · 2216 阅读 · 0 评论 -
c++中STL的常用算法---2(遍历算法,查找算法)
算法概述算法主要由头文件组成是所有STL头文件中最大的一个,其中常用的功能涉及到比较,交换,查找,遍历,复制,修改,反转,排序,合并等体积很小,只包括在几个序列容器上进行的简单运算的模板函数定义一些模板类,用以声明函数对象遍历算法for_each()for_each: 用指定函数依次对指定范围内所有元素进行迭代访问。该函数不得修改 序列中的元素。for_each基础遍历#...原创 2019-08-05 22:10:20 · 314 阅读 · 0 评论 -
c++中的异常--1(基本概念, c语言中处理异常,c++中处理异常,异常的基本使用,栈解旋)
异常基本概念异常处理就是处理程序中的错误,所谓错误是指在程序运行的过程中发生的一些异常事件(如:除0退出,数组下标越界,所要读取的文件不存在,空指针,内存不足等等)c语言中处理异常两种方法:使用整形的返回值标识错误;使用errno宏(可以简单的理解为一个全局整形变量)去记录错误,当然c++中仍然可以用这两种方法的。这两种方法最大的缺陷就是会出现不一致问题,例如有些函数返回1...原创 2019-07-28 12:00:15 · 477 阅读 · 0 评论 -
c++对const增强 和cosnt分配内存情况
const增强c语言中const是伪常量,可以通过指针修改c++中const会放到符号表中c语言中const默认是外部连接,c++中const默认是内部链接 #include<iostream> using namespace std; const int m_a = 10; //在全局区域里,受到保护,不可以被更改 ...原创 2019-07-06 10:51:56 · 188 阅读 · 0 评论 -
设计模式--1(设计模式基础,设计模式基本原则,设计模式分类)
设计模式基础模式在一定环境中解决某一问题的方案,包括三个基本元素–问题,解决方案和环境。大白话:在一定环境下,用固定套路解决问题。...原创 2019-09-13 10:57:11 · 239 阅读 · 1 评论 -
设计模式----2(简单工厂模式的概念,简单工厂模式的实现,简单工厂模式的优缺点)
简单工厂模式简单工厂模式的概念简单工厂模式属于类的创建型模式,又叫做静态工厂方法模式。通过专门定义一个类来负 责创建其他类的实例,被创建的实例通常都具有共同的父类。具体分类工厂(Creator)角色 简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类可以被外界直接调 用,创建所需的产品对象。抽象(Product)角色简单工厂模式所创建的所有对象的父类,它负责描述所有实例所...原创 2019-09-13 20:06:02 · 749 阅读 · 1 评论 -
设计模式---3(工厂方法模式的概念,工厂方法模式的实现,工厂方法模式和简单工厂模式比较)
工厂方法模式概念工厂方法模式同样属于类的创建型模式又被称为多态工厂模式 。工厂方法模式的意义定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。 核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类 必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。工厂方法模式的角色和职责抽象工厂(Cre...原创 2019-09-15 19:45:25 · 156 阅读 · 0 评论 -
设计模式---4(抽象工厂模式的概念,产品组和产品等级的概念,抽象工厂模式的实现)
抽象工厂模式抽象工厂模式的概念抽象工厂模式是所有形态的工厂模式中最为抽象和最其一般性的。抽象工厂模式可以向 客户端提供一个接口,使得客户端在不必指定产品的具体类型的情况下,能够创建多个产品 族的产品对象。抽象工厂的角色及其职责抽象工厂(Creator)角色 抽象工厂模式的核心,包含对多个产品结构的声明,任何工厂类都必须实现这个接口。具体工厂( Concrete Creator)角色 ...原创 2019-09-15 20:53:02 · 474 阅读 · 0 评论