CPP
文章平均质量分 59
Hidden.Blueee
这个作者很懒,什么都没留下…
展开
-
cpp-httplib库的简介与工作流程
A C++11 single-file header-only cross platform HTTP/HTTPS library.It’s extremely easy to setup. Just include the httplib.h file in your code!NOTE:This is a multi-threaded ‘blocking’ HTTP library. If you are looking for a ‘non-blocking’ library, this is.原创 2021-07-05 22:49:45 · 7899 阅读 · 0 评论 -
设计只能创建一个对象的类(单例模式)
单例模式一个类只能创建一个对象,即单例模式,该模式可以保证系统中该类只有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息,这种方式简化了在复杂环境下的配置管理。饿汉模式程序启动时就创建一个唯一的实例对象。class Singleton{ static Singleton* getInstance() { return &原创 2021-06-07 17:11:34 · 1164 阅读 · 0 评论 -
海量数据处理题
题目一给两个文件,分别有100亿个query,我们只有1G内存,如何找到两个文件交集?分别给出精确算法和近似算法。如何扩展BloomFilter使得它支持删除元素的操作精确结果注意不能直接使用位图假设将文件1中的每条query映射到位图中,然后检测第二个文件中的query是否在位图中出现过。在用query对位图进行操作时,必须将query转换为整形数字,而两个不同的query可能会转化为同一个记录,再到位图中进行查找 时,可能就会认为这两条query是同一个,而将其当成交集,就会出错,结果就原创 2021-06-04 16:41:56 · 210 阅读 · 0 评论 -
C++11右值引用
左值与右值左值与右值是C语言中的概念,但C标准并没有给出严格的区分方式,一般认为:可以放在=左边的,或者能够取地址的称为左值,只能放在=右边的,或者不能取地址的称为右值,但是这并不是完全准确。比如:a,b都是左值,b既可以放在=左侧也可以放在右侧。int a = 10;int b = 20;a=b;b=a;左值与右值很难区分,一般认为:普通类型的变量,可以取地址,都认为是左值。const修饰的常量,不可修改,只读类型的,理论上应该按照右值对待,但因为其可以取地址,C++11认为其是左原创 2021-06-02 13:14:41 · 86 阅读 · 0 评论 -
unordered_map和unordered_set的模拟实现
定义哈希表(Hash table,也叫散列表),是根据关键字值(key,value)直接进行访问的数据结构。也就是说,它通过把关键字映射到表中一个位置来访问的纪录,以加快查找的速度。这个映射函数叫做散列函数,存放纪录的数组叫散列表。基本原理使用一个下标范围比较大的数组来存储元素。可以设计一个函数(哈希函数,也叫做散列函数),使得每个元素的关键字都与一个函数值(即数组下标,hash值)相对应,于是用这个数组单元来存储这个元素。哈希冲突通过哈希函数产生的哈希值是有限的,而数据可能比较多,导致经过哈原创 2021-05-28 14:15:26 · 127 阅读 · 0 评论 -
AVL树四种旋转详解
平衡二叉树平衡二叉搜索树(Self-balancing binary search tree)又被称为AVL树(有别于AVL算法),且具有以下性质:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。平衡因子某结点的左子树与右子树的高度(深度)差即为该结点的平衡因子(Balance Factor)。平衡二叉树上所有结点的平衡因子只可能是 -1,0 或 1。四种旋转情况往平衡二叉树中添加节点很可能会导致二叉树失去平衡,所以我们需要在每次插入节点后进行平衡的原创 2021-05-16 11:13:08 · 1188 阅读 · 0 评论 -
map中的[ ]重载(map::operator[])
其中我们可以见到调用[]就相当于执行下面我们来分析这段代码:make_pair(k,mapped_type()创建一个pair对象,内容 k—value缺省值this->insert(make_pair(k,mapped_type())插入第一步创建的pair对象成功,返回pair<pair对象的迭代器,true>失败,返回pair<已经存在键值为k的pair对象迭代器,false>(this->insert(make_pair(k,mapp原创 2021-05-12 13:18:56 · 867 阅读 · 0 评论 -
二叉搜索树实现
删除分情况当前节点没有左右孩子可直接删除当前节点只有左孩子可直接删除当前节点只有右孩子可直接删除当前节点有左右孩子当前节点左右孩子都存在,直接删除不好删除,可以在其子树中找一个替代结点。找其左子树中的最大节点,即左子树中最右侧的节点,或者在其右子树中最小的节点,即右子树中最小的节点。替代节点找到后,将替代节点中的值交给待删除节点,转换成删除替代节点#include <time.h>#include<iostream>using namespace std原创 2021-05-12 11:11:58 · 73 阅读 · 0 评论 -
C++多态详解
多态的概念当不同的对象去完成某个行为时会产生出不同的状态。比如:买火车票,普通人是全价,学生是半价,儿童是免票。多态的定义和实现在了解多态的构成条件之前,我们首先要了解虚函数和重写。虚函数被virtual修饰的类成员函数称为虚函数。class person{public: virtual void buyTicket() { cout << "买票——全价" << endl; }};重写派生类中有一个跟基类完全相同的虚函数(即派生类虚函数与基类虚原创 2021-04-28 18:12:46 · 268 阅读 · 0 评论 -
继承
继承的概念和定义继承的概念继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段。它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。示例:#include<iostream>using namespace std;class Animal{public: void Print() { co原创 2021-04-26 19:46:39 · 160 阅读 · 1 评论 -
模拟实现stack,queue,priority_queue
stack#include<deque>using namespace std;template<class T,class Con=deque<T>>class Stack{public: Stack() { } void push(const T& x) { _c.push_back(x); } void pop() { _c.pop_back(); } T& top() { return _c.back(原创 2021-04-18 11:11:17 · 89 阅读 · 0 评论 -
list和vector区别
项目vectorlist底层结构动态顺序表,一段连续空间带头结点的双向循环链表随机访问支持随机访问,访问某个元素效率O(1)不支持随机访问,访问某个元素效率O(N)插入和删除任意位置插入和删除效率低,需要搬移元素,时间复杂度为O(N),插入时有可能需要增容,增容:开辟新空间,拷贝元素,释放旧空间,导致效率更低任意位置插入和删除效率高,不需要搬移元素,时间复杂度为O(1)空间利用率底层为连续空间,不容易造成内存碎片,空间利用率高,缓存利用率高底层节点动态...原创 2021-04-11 15:17:31 · 90 阅读 · 0 评论 -
类的默认成员函数——拷贝构造函数
文章目录概念特征概念拷贝构造函数:只有 单个形参,该形参是对本类类型对象的 引用(一般常用const修饰),在用已存在的类类型对象创建新对象时由 编译器自动调用。特征拷贝构造函数也是特殊的成员函数。其特点如下:1.拷贝构造函数是构造函数的一个重载形式。2.拷贝构造函数的参数 只有一个且必须使用引用传参,使用传值方式会引发无穷递归调用。错误示例:class Date{public: Date(int year = 2021, int month = 1, int day = 1原创 2021-04-06 16:52:57 · 2857 阅读 · 0 评论 -
类的默认成员函数——构造函数
概念对于以下的Date类,可以通过setDate公有的方法给对象设置内容,但是如果每次创建对象都调用该方法设置信息,就显得很麻烦,那能否在对象创建时,就将信息设置进去呢?#include<iostream>using namespace std;class Date{public: void setDate(int year, int month, int day) { _year = year; _month = month; _day = day; } voi原创 2021-04-06 16:52:51 · 465 阅读 · 0 评论 -
vector迭代器失效问题
vector的迭代器失效问题有两种情况1.引起底层空间改变的操作例如:resize、reserve、insert、assign、push_back等。来看代码:(编译器:VS2013)#include <iostream>using namespace std;#include <vector>int main(){ vector<int> v{ 1, 2, 3, 4, 5, 6 }; auto it = v.begin(); //1.r原创 2021-04-04 12:08:32 · 393 阅读 · 0 评论 -
C++模拟实现String类
目的模拟实现string类里的构造函数,拷贝构造,赋值运算符重载,析构函数,增删查改,迭代器等一些功能。模拟实现#include <stdlib.h>#include <string.h>#include<iostream>#include <assert.h>using namespace std;class String{public: typedef char* iterator; typedef const char* con原创 2021-03-30 17:06:44 · 96 阅读 · 0 评论 -
C++实现日期类
使用重载运算符(+,-,+=,-=,<,>等)实现日期类的操作。#include <iostream>using namespace std;class Date{public: int getDay(int year, int month) { static int days[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; int day = days[month]; if (mo原创 2021-03-11 14:50:35 · 215 阅读 · 0 评论 -
explicit关键字
explicit构造函数不仅可以构造与初始化对象,对于单个参数的构造函数,还具有类型转换的作用。示例:class Date{public: Date(int year) :_year(year) { }private: int _year;};void Test(){ Date d1(2020); //用一个整型变量给日期类对象赋值 //2021,编译器调用构造创建一个匿名对象,调用赋值运算符,把匿名对象内容赋给d1 d1 = 2021;}转换过程:上述代码原创 2021-03-18 15:19:47 · 67 阅读 · 1 评论 -
内部类
内部类概念:如果一个类定义在另一个类的内部,这个内部类就叫做内部类。注意:此时这个内部类是 一个独立的类,它不属于外部类,更不能通过外部类的对象去调用内部类 。内部类就是外部类的友元类。注意友元类的定义,内部类可以通过外部类的对象参数来访问外部类中的所有成员。但是外部类不是内部类的友元。特性:内部类可以定义在外部类的public、protected、private都是可以的。内部类可以直接访问外部类中的static、枚举成员,不需要外部类的对象/类名。 sizeof(外部类)=外部原创 2021-03-18 15:20:08 · 68 阅读 · 0 评论 -
C++11基于范围的for循环
参考链接:http://c.biancheng.net/view/7759.htmlC++ 98/03中的for循环在C++11标准之前 ,如果要用 for 循环语句遍历一个数组或者容器,只能套用如下结构:for (表达式1; 表达式2; 表达式3){ //循环体}C++11范围for循环C++ 11提供了基于范围的 for 循环。在使用基于范围的 for 循环处理数组时,该循环可以自动为数组中的每个元素迭代一次。范围for格式for (DataType RangeVariable原创 2021-03-18 14:37:55 · 360 阅读 · 0 评论 -
this指针
首先我们定义一个日期类:#include <iostream>using namespace std;class Date{public: void Display() { cout << _year << "-" << _month << "-" << _day << endl; } void SetDate(int year, int month, int day) { _year = ye原创 2021-03-17 12:15:01 · 139 阅读 · 0 评论 -
C++模板基础(泛型编程的基础)
泛型编程 泛型编程让你编写完全一般化并可重复使用的算法,其效率与针对某特定数据类型而设计的算法相同。泛型即是指具有在多种数据类型上皆可操作的含义,而模板也是泛型编程中的一种典型例子。函数模板概念函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。打个比方: 现在有一个锤子的模具,通过灌注不同的材料(类型)就可以得到,不同材料的锤子(生成具体类型的代码)。格式声明模板格式:template<typename T1,typename原创 2021-03-15 15:20:20 · 153 阅读 · 0 评论 -
C++内存管理
版权声明:本文为CSDN博主「skr爱码士」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/skrskr66/article/details/92769994栈和堆首先要理解一个关键的问题。我们此时说的是内存分配中的栈和堆,不是在讨论数据结构中的栈和二叉堆。我在之前学习操作系统的时候划过一个图,是关于Linux下操作系统程序地址空间的。中间还有栈区和堆区的分布。从图中可以看出基本分布,内存中的栈区是处于高地址以转载 2021-03-15 13:19:03 · 384 阅读 · 0 评论 -
C++动态内存管理-new&delete
文章目录引入new和delete的用法new\delete操作内置类型new\delete操作自定义类型注意operator new & operator deleteoperator new & operator delete的重载new和delete的实现原理内置类型自定义类型定位new表达式malloc/free和new/delete区别引入在C语言中,申请的空间都是在堆区上开辟的,申请的方式有三种:void* malloc(size_t size):size为要分配的字节数。原创 2021-03-15 12:42:23 · 128 阅读 · 0 评论 -
static成员
声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量;用static修饰的成员函数,称之为静态成员函数。静态的成员变量一定要在类外进行初始化。实现一个类,计算中程序中创建出了多少个类对象#include <iostream>#include <stdlib.h>using namespace std;class A{public: A() { ++_count; } A(const A& a) { ++原创 2021-03-14 16:22:09 · 132 阅读 · 0 评论 -
友元
文章目录友元友元函数友元类友元友元分为:友元函数和友元类友元提供了一种突破封装的方式,有时提供了便利。但是友元会增加耦合度,破坏了封装,所以友元不宜多用。友元函数我们尝试重载operator<<:#include <iostream>using namespace std;class Date{public: Date(int year, int month, int day) :_year(year) , _month(month) , _day原创 2021-03-12 08:54:59 · 110 阅读 · 0 评论 -
引用
引用引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。引用特性引用在定义时必须初始化一个变量可以有多个引用引用一旦引用一个实体,再不能引用其他实体 int a = 10; //引用必须初始化 //int& ra编译错误; int& ra = a; //变量有多个引用 int& ra1 = a; int& ra2 = a; //不是修改引用的指向,而是把b的内容赋值给ra1原创 2021-03-10 20:30:07 · 714 阅读 · 0 评论 -
初始化列表
引言在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个初始值。例:class Date{public: Date(int year, int month, int day) { //不是初始化 _year = year; _month = month; _day = day; }private: int _year; int _month; int _day;};在例子中,调用构造函数之后,对象中已经有了一个初始值,但是不能将其称作为类对象成员的初原创 2021-03-10 20:29:54 · 678 阅读 · 1 评论 -
命名空间namespace
如果当一个班上有两个名叫l张三的学生时,为了明确区分它们,我们在使用名字之外,需要使用一些额外的信息,比如他们的身份证号、电话等等。在C/C++中,变量、函数和类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会和自己写的同名程序导致很多冲突。因此引入命名空间对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。命名空间的定义命名空间中的内容,可以定义变量也可以定义函数。1.普通的命名空间namespace n1//n1为命原创 2021-03-08 14:48:45 · 95 阅读 · 0 评论 -
函数重载
什么是函数重载函数重载是指在同一作用域内,可以有一组具有相同函数名,不同参数列表(参数个数、类型、顺序)的函数,这组函数被称为重载函数。示例:#include <stdio.h>int add(int a, int b){ return a + b;}double add(double a, double b){ return a + b;}long add(long a, long b){ return a + b;}int main(){ add(原创 2021-03-08 14:47:43 · 597 阅读 · 0 评论