C++
Persistence_Y_1
这个作者很懒,什么都没留下…
展开
-
谈一谈你所理解的TopK问题
在实际的应用和工作当中, 我们经常会遇到在海量的数据当中寻找出前K个最大值或最小值的问题, 为了实现这个功能, 我们最先想到的方法可能就是排序, 在排序之后的序列当中取出前K个即可, 这样的方法确实可以, 但是存在一定的问题, 千万不要忘了这个问题的前提海量数据, 这就也就是说当数据规模过大内存放不下的时候, 我们再去使用常见的排序就无法解决.因此, 对于这种海量数据的TopK问题, 一种经常使用的方法就是借助堆去解决 使用堆原创 2020-09-02 19:43:52 · 331 阅读 · 0 评论 -
代码实现LRU最近很少使用算法
LRU全称(Least Recently Used), 称为最近很少使用算法.意思是, 根据最近访问的记录, 对于缓存的数据进行淘汰, 如果一个数据最近被访问, 或者经常被访问, 那么它就会处于列表前面的位置(比如数组或者链表的前面), 而一个数据很长时间没有被访问, 就会处于靠后的位置, 这个时候缓存如果满了, 来了新的数据, 就会把处于尾部的数据淘汰掉, 并将新的数据放入列表.LRU算法通常是用一个哈希表和一个双向列表实现的其实就如我们之前在概念中提到的那样, 也可以是一个数组, 也可以是一个列表原创 2020-07-27 12:22:19 · 215 阅读 · 0 评论 -
如何理解C++中的继承, 多继承, 菱形继承以及继承中较为重要的知识点总结
首先, 什么是继承?继承的概念继承是指面向对象程序设计使代码可以复用的重要手段, 它允许程序员在保持原有类特性的基础上进行扩展, 增加功能, 这样产生的类, 称为派生类(也称作子类).这样讲了一大串, 其实核心的点就是:继承是类设计层次的复用(也就是针对类的代码复用, 让我们可以不用再去写一些重复度较高的类代码)举例来说明:举例之前, 我们先来看一下继承的定义格式class A{};//B继承了Aclass B : public A{};//其中A为基类(父类), B为派生类(子类)原创 2020-06-28 21:53:20 · 361 阅读 · 1 评论 -
关于C++的内存管理, 以及C++当中的 operator new和operator delete函数, 定位new表达式
在C语言当中, 动态内存的管理方式分为 malloc / calloc / realloc 和 freemalloc函数可以在堆上申请指定字节的内存空间, 申请成功返回申请到的空间的首地址, 如果申请失败会返回NULL.void* malloc(size_t size);注意malloc申请到的空间是没有经过初始化的calloc函数与malloc的功能相似, 但是calloc申请到的空间是经过初始化的, 初始化内容为0. void* malloc(size_t, num, size_t s原创 2020-05-25 21:31:53 · 308 阅读 · 1 评论 -
关于C++当中泛型编程, 模板初阶(函数模板, 类模板)详解
C++泛型编程在C++当中, 泛型编程是一个十分重要的概念, 那么泛型编程到底是什么? 而它的作用及优点在哪里? 下面我们将一步步解释C++当中的泛型编程, 函数模板和类模板举个简单的例子, 在我们C语言当中, 如果我们想要实现一个交换函数, 比如下面这样:void Swap(int* a, int* b){ int tmp = *a; *a = *b; *b = tmp;}这...原创 2020-05-08 18:53:27 · 412 阅读 · 0 评论 -
字符串相加, 大数加法
题目描述给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。注意:num1 和num2 的长度都小于 5100.num1 和num2 都只包含数字 0-9.num1 和num2 都不包含任何前导零。你不能使用任何內建 BigInteger 库, 也不能直接将输入的字符串转换为整数形式。来源:力扣链接:字符串相加思路:首先根据字符串 num1 和 num2的长...原创 2020-06-03 20:37:49 · 784 阅读 · 0 评论 -
C++当中提供的字母和数字相关的判断函数, 以及位运算对大小写字母转化的实现
字母数字相关判断的函数isalnum(char c) 判断是否为字母或者数字isalpha(char c) 判断是否为字母isdigit(char c) 判断是否为数字islower(char c) 判断是否为小写字母isupper(char c) 判断是否为大写字母...原创 2020-05-03 21:33:08 · 618 阅读 · 0 评论 -
C++模板
泛型编程之前我们实现的一般的交换函数//一般的交换函数void Swap(int & a, int & b){ int tmp = a; a = b; b = tmp;}//函数重载void Swap(double & a, double & b){ double tmp = a; a = b; b = tmp;}void Swa...原创 2020-01-02 19:46:42 · 102 阅读 · 0 评论 -
malloc/free和new/delete的区别
malloc/free和new/delete的共同点是:都是从堆上申请空间, 并且都需要用户手动释放不同点malloc和free是函数, new和delete是操作符malloc申请的空间不会初始化, new可以malloc申请空间的时候需要手动计算空间的大小并传递, new只需要在后面跟上空间的类型即可malloc的返回值为void *, 因此在使用时必须类型强转, new 不需要...原创 2019-12-30 23:53:27 · 193 阅读 · 0 评论 -
C++动态内存分配,operator new,operator delete以及new定位表达式
C++动态内存分配operator new/delete函数new和delete是用户进行动态内存申请和释放的操作符, operator new和operator delete是系统提供的全局函数.new 在底层调用operator new全局函数申请空间operator new 函数实际通过malloc申请空间, 当malloc申请空间成功的时候直接返回; 如果申请空间失败, 会尝试执行...原创 2019-12-27 20:30:01 · 206 阅读 · 0 评论 -
C/C++内存管理
C/C++内存分布栈,堆,全局区,常量区,代码区栈, 又叫堆栈,系统自动分配的空间,只要不特殊声明,就定义在栈区,比如非静态局部变量,函数参数,返回值等等,函数的区域也在栈上,栈是向下增长的。使用动态内存分配的方式可以申请堆空间,使用完要记得手动释放全局区:静态变量(static),全局变量常量区:代码区中的数字,字符等常量,例如 ‘a’, -1.2等代码区:存放可执行的代码,避免频...原创 2019-12-24 23:26:38 · 109 阅读 · 0 评论 -
再谈C++构造函数,构造函数体赋值,初始化列表,explicit关键字
构造函数体赋值在创建对象时,编译器通过调用构造函数, 给对象中各个成员变量一个合适的初值比如之前的Date类:class Date{ int m_year; int m_month; int m_day;public: Date(int year, int month, int day) { m_year = year; m_month = month; m_day...原创 2019-12-10 23:16:22 · 120 阅读 · 0 评论 -
C++求数组中最大子段和补充
求最大字段和int FindGreatestSumOfSubArray(vector<int> array) { int Max = array[0]; int * f = new int[array.size() + 1]; f[0] = array[0]; for (int i = 1; i < array.size(); ++i) { f[i] = max...原创 2019-12-08 23:11:33 · 148 阅读 · 0 评论 -
C++类和对象中的const成员,取地址及const取地址操作符重载
const修饰类的成员函数将const修饰的类成员函数称之为const成员函数.const修饰类的成员函数, 实际上修饰的是该成员函数隐含的this指针, 这表明在该成员函数中不能对类的任何成员进行修改.看下面这段代码:#include <iostream>using namespace std;class Date{ int m_year; int m_mont...原创 2019-12-09 23:04:12 · 483 阅读 · 0 评论 -
类和对象中的拷贝构造函数和赋值运算符重载
拷贝构造函数也是特殊的成员函数, 具有下面的特征:拷贝构造函数也是构造函数的一个重载形式拷贝构造函数的参数只有一个并且必须使用引用传参(注意如果使用传值的方式会引起无限递归调用)这里我们仍然使用之前的Date类来作为例子:#include <iostream>using namespace std;class Date{ int m_year; int m_m...原创 2019-12-05 22:35:40 · 462 阅读 · 0 评论 -
C++模拟扑克牌的实现
#include <iostream>#include <ctime>using namespace std;enum{ SPADES, HEARTS, CLUBS, DIAMONDS, JOKER};class Poker{ char m_type; int m_point;public: Poker() : m_type(0),...原创 2019-12-04 22:52:35 · 1392 阅读 · 0 评论 -
用函数重载的方式编写程序,统计出一个以给定结构为基准的结构体数组中名字/年龄/班级/性别为X的出现了多少次
有以下结构:struct student{ char name[32]; int age; int class; bool sex; }; 写出函数,用函数重载的方式编写程序,统计出一个以上述结构为基准的结构体数组中:1、名字为X的出现了多少次2、年龄为X的出现了多少次3、班级为X的出现了多少次4、性别的X的出现了多少次#include <iostream&...原创 2019-12-02 18:08:23 · 352 阅读 · 0 评论 -
类和对象中的构造函数和析构函数
首先我们先来大致了解类中的6个默认成员函数当一个类中任何成员都没有的时候,我们就简称其为空类,但是我们要知道的是,空类当中也并不是什么都没有,任何一个类,在我们不去写的情况下,都会自动生成下面的6个默认成员函数。这就是类中的6个默认成员函数。这6个默认成员函数可以分为以下三类:初始化和清理构造函数:完成初始化工作析构函数:完成清理工作拷贝复制拷贝构造:使用同类对象初始化创建对象赋...原创 2019-12-01 22:48:20 · 873 阅读 · 0 评论 -
类的作用域,实例化和this指针
类的作用域类定义了一个新的作用域,类的所有成员都在类的作用域中。在类外定义成员,需要使用::作用域解析符,指明成员属于哪个类域比如下面这个例子:#include <iostream>using namespace std;class Person{public: void PrintPersonInfo();private: char m_name[20]; ...原创 2019-11-28 23:44:09 · 227 阅读 · 0 评论 -
C++类与对象的初步认知
我们经常说到,C语言与C++最大的区别就在于:C语言是面向过程的,关注的是解决问题的过程,分析出求解问题的步骤,通过函数调用逐步解决问题。而C++是基于面向对象的,关注的是对象,将一件事情拆分成为不同的对象,靠对象之间的交互完成。首先我们先来回忆C语言中的结构体#include <stdio.h>#include <stdlib.h>struct A1{ ...原创 2019-11-27 22:51:29 · 112 阅读 · 0 评论 -
将一个字符串转换为数字,返回值用来校验转换是否成功
#include <iostream>using namespace std;bool strtoi(const char * src, int & res){ if (!src) { return false; } if (*src <= ' ') { src++; } int flag = 1; if (*src == '-')...原创 2019-11-25 17:37:32 · 220 阅读 · 0 评论 -
C++完成对结构体的排序,通过传入判断大小的函数来实现
这里我们可以定义一个扑克牌的结构体,模拟扑克牌的实现和手牌排序(也就是完成对结构体的排序)#define _CRT_SECURE_NO_WARNINGS#include <iostream>using namespace std;//首先定义一个结构体struct Poker{ char type; //花色 int point; //大小};enum{...原创 2019-11-26 22:07:21 · 224 阅读 · 0 评论 -
C++将一个数字通过指定进制按位逆置(直接覆盖原数)
#include <iostream>using namespace std;void sysReverse(int & num, int hex){ int tmp; int i = num; int sum = 0; for (; i; i = i / hex) { tmp = i % hex; sum = sum * hex + tmp; }...原创 2019-11-22 18:36:15 · 259 阅读 · 0 评论 -
C++模拟实现string类
#pragma once#define _CRT_SECURE_NO_WARNINGS#include <string.h>#include <stdlib.h>#include <iostream>using namespace std;#define DEFAULTCAPA 16#define COUNTCAPA(size) (((siz...原创 2019-11-21 18:10:00 · 177 阅读 · 0 评论 -
写一个排序函数接口,完成对整数和小数的排序。并且利用缺省参数的方式传入排序规则
写一个排序函数接口,能完成对整数和小数的排序接口中多传入一个缺省参数。如果不指定就是用A排序方式,指定了就按传入的排序方式首先我们实现一个排序函数接口,既能完成对整数的排序,又能完成对小数的排序。这里用到的知识其实是函数重载,相同的函数,传入的参数不同,分别处理不同的数据。用到的排序方法是插入排序。 插入排序#include <iostream>using name...原创 2019-11-19 22:31:53 · 247 阅读 · 0 评论 -
关于C++中的auto关键字,基于范围的for循环
关于auto关键字的简介在早期的C / C++中的auto含义是使用auto修饰的变量,是具有自动存储器的局部变量。在C++11中,赋予了auto全新的含义,也就是auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。来看一段代码#include <iostream>#include <typeinf...原创 2019-11-18 23:02:05 · 611 阅读 · 0 评论 -
给一个非空的单词列表,输出前n个出现次数最多的单词
给一个非空的单词列表,输出前n个出现次数最多的单词返回的答案应该按单词出现频率由高到低排序,如果不同的单词有相同的出现频率,按字母顺序排序#include <iostream>#include <string>#include <vector>#include <map>#include <set>#include <...原创 2019-11-17 22:10:21 · 772 阅读 · 0 评论 -
有n堆石子,每次取出两堆合成一堆,每堆石子的个数即为合并石子所需要耗费的体力,求出合并所有石子堆所需要耗费的最小体力
有n堆石子,每次取出两堆合成一堆,每堆石子的个数即为合并石子所需要耗费的体力,求出合并所有石子堆所需要耗费的最小体力典型的贪心题,即每次取出数量最少的两堆石子合并.举个例子来说,假如有5堆石子,石子个数分别为1 2 3 4 5为了使得耗费的体力最小,我们需要每次合并石子数最小的和次小的两堆石子第一次1 + 2 ,耗费3点体力石子堆变为3 3 4 5第二次3 + 3 ,耗费6 点...原创 2019-11-16 22:40:18 · 1774 阅读 · 0 评论 -
C++统计字符串中每个字符出现的次数
#include <iostream>#include <string>#include <set>#include <map>using namespace std;//统计字符串中每个字符出现的次数int main(){ string s; cin >> s; map<char, int> m;...原创 2019-11-15 20:25:46 · 9353 阅读 · 1 评论 -
C++将一个有序数组按顺序移动,在移动后的数组中查找一个数字
在有序数组中查找一个数字,可以使用二分查找该题给定的是有序数组移动后的数组,所以不能直接利用二分查找给定的数组为4, 5, 6, 7, 8, 9, 1, 2, 3思路是先找到断点,也就是该数组中数字1所在的位置由于数组是一个升序排列的有序数组,所以我们同样可以利用二分的思路去查找断点 if (src[mid] > src[mid + 1]) { return mid ...原创 2019-11-12 17:50:50 · 487 阅读 · 0 评论 -
输入一个字符串,求出该字符串包含的字符集合,例如:输入 abcqwerabc ,输出,acbwqer
方法一:设置一个bool数组,用来记录字符的置为,初始化为false、bool vis[74] = { false }; 设置一个num字符数组记录需要输出的字符char num[55]; 设置一个字符数组, 并输入char ch[101];cin >> ch;遍历字符串,利用ASCII码值给相应的字符置位for (int i = 0; ch[i]; i++...原创 2019-11-11 20:57:35 · 2170 阅读 · 0 评论 -
C++逆波兰表达式求值
#include <iostream>#include <vector>#include <string>#include <stack>using namespace std;//逆波兰表达式求值int evalRPN(vector<string>& tokens) { stack<int> t...原创 2019-10-25 22:35:15 · 907 阅读 · 2 评论 -
C++对于栈的压入弹出序列的判断
#include <iostream>#include <vector>#include <stack>using namespace std;//栈的压入弹出序列bool IsPopOrder(vector<int> pushV, vector<int> popV) { stack<int> stmp;...原创 2019-10-23 15:53:33 · 337 阅读 · 0 评论 -
C++实现二叉树的中序遍历
#include <iostream>#include <vector>#include <stack>using namespace std;//C++实现二叉树中序遍历struct TreeNode{ int val; TreeNode * left; TreeNode * right; TreeNode(int x) : val...原创 2019-10-20 20:40:04 · 1957 阅读 · 0 评论 -
C++实现二叉树的层序遍历, 并按层次打印
#include <iostream>#include <vector>#include <queue>using namespace std;struct TreeNode{ int val; TreeNode * left; TreeNode * right; TreeNode(int x) : val(x), left(NULL...原创 2019-10-16 18:22:02 · 2053 阅读 · 0 评论 -
C++中用两个栈实现一个队列
#include <iostream>#include <stack>using namespace std;//两个栈实现一个队列class stackQueue{ stack<int> m_s1; stack<int> m_s2;public: stackQueue() { } void push(int i)...原创 2019-10-14 22:34:34 · 1203 阅读 · 0 评论 -
C++求数组中最大子段和
两种方法求最大子段和#include <iostream>#include <vector>#include <algorithm>using namespace std;#if 0int FindGreatestSumOfSubArray(vector<int> array) { //vector<int> tmp(a...原创 2019-09-25 08:44:26 · 668 阅读 · 0 评论 -
C++函数重载, 缺省参数
在我们的自然语言当中, 一个词在不同的情景之下可能会有多重不同的含义, 但是我们可以通过合理地判断来确定该词的真正含义, 这种情况, 我们可以说该词被"重载"了.关于函数重载的概念函数重载其实就是函数的一种特殊的情况, 在我们的C++中允许在同一作用域当中声明几个功能类似的同名函数, 但是这个同名函数的形参列表(参数个数或是参数类型或是参数的顺序)必须不同, 经常用来处理想要实现功能类似而数据...原创 2019-09-26 10:40:21 · 272 阅读 · 0 评论 -
C++中的字符串逆置
#include <iostream>#include <string>#include <algorithm>using namespace std;void reverseString(string &s){ int i, j; for (i = 0, j = s.size() - 1; i < j; ++i, --j) {...原创 2019-09-29 09:29:04 · 2213 阅读 · 1 评论 -
C++找到字符串第一次只出现一次的字符
#include <iostream>#include <string>using namespace std;//找到字符串第一次只出现一次的字符,找到后返回下标int firstUniqChar(string s){ int count[26] = { 0 }; for (auto & i : s) { count[i - 'a']++...原创 2019-10-07 21:18:51 · 642 阅读 · 0 评论