C++
文章平均质量分 81
Shriven_雯
这个作者很懒,什么都没留下…
展开
-
C++ explicit关键字详解
首先, C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的, 跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造函数默认情况下即声明为implicit(隐式).那么显示声明的构造函数和隐式声明的有什么区别呢? 我们来看下面的例子:classCxString//没有使用explicit关键字的类声明,...转载 2019-05-27 17:21:19 · 169 阅读 · 0 评论 -
C++——map基本操作总结
标准库map类型是一种以键-值(key-value)存储的数据类型。以下分别从以下的几个方面总结:map对象的定义和初始化map对象的基本操作,主要包括添加元素,遍历等1、pair类型1.1、pair类型的定义和初始化pair类型是在有文件utility中定义的,pair类型包含了两个数据值,通常有以下的一些定义和初始化的一些方法:pair<T1, T2> p;pai...转载 2019-05-06 10:41:07 · 252 阅读 · 0 评论 -
lintcode(18)——骰子求和
20.骰子求和扔n个骰子,向上面的数字之和为S。给定n,请列出所有可能的S值及其相应的概率。样例 1:输入:n = 1输出:[[1, 0.17], [2, 0.17], [3, 0.17], [4, 0.17], [5, 0.17], [6, 0.17]]解释:掷一次骰子,向上的数字和可能为1,2,3,4,5,6,出现的概率均为 0.17。样例 2:输入...原创 2019-05-08 16:24:27 · 389 阅读 · 0 评论 -
lintcode(11)——数组划分
31.数组划分给出一个整数数组nums和一个整数k。划分数组(即移动数组nums中的元素),使得:所有小于k的元素移到左边 所有大于等于k的元素移到右边返回数组划分的位置,即数组中第一个位置i,满足nums[i] 大于等于k。样例Example 1:Input:[],9Output:0Example 2:Input:[3,2,2,...原创 2019-04-30 10:53:05 · 149 阅读 · 0 评论 -
lintcode(10)——插入区间
30.插入区间给出一个无重叠的按照区间起始端点排序的区间列表。在列表中插入一个新的区间,你要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。样例样例 1:输入:(2, 5) into [(1,2), (5,9)]输出:[(1,9)]样例 2:输入:(3, 4) into [(1,2), (5,9)]输出:[(1,2), (3,4)...原创 2019-04-29 17:08:41 · 180 阅读 · 0 评论 -
lintcode(5)——主元素
46.主元素给定一个整型数组,找出主元素,它在数组中的出现次数严格大于数组元素个数的二分之一。样例 1:输入: [1, 1, 1, 1, 2, 2, 2]输出: 1样例 2:输入: [1, 1, 1, 2, 2, 2, 2]输出: 2挑战要求时间复杂度为O(n),空间复杂度为O(1)注意事项你可以假设数组非空,且数组中总是存在主元素。...原创 2019-04-20 10:36:33 · 270 阅读 · 0 评论 -
C++ 回溯法
一、定义 在包含问题的所有解的解空间树中,按照深度优先搜索的策略,从根结点出发深度探索解空间树。当探索到某一结点时,要先判断该结点是否包含问题的解,如果包含,就从该结点出发继续探索下去,如果该结点不包含问题的解,则逐层向其祖先结点回溯。(其实回溯法就是对隐式图的深度优先搜索算法)。 若用回溯法求问题的所有解时,要回溯到根,且根结点的所有可行的子树都要已被搜索遍才结束。 而若使用回溯...原创 2019-05-04 20:18:37 · 7142 阅读 · 0 评论 -
lintcode(15)——全排列
15.全排列给定一个数字列表,返回其所有可能的排列。样例 1:输入:[1]输出:[ [1]]样例 2:输入:[1,2,3]输出:[ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1]]挑战使用递归和非递归分别解决。注意事项你可以假设没有重复数字。思路:...原创 2019-05-04 19:41:19 · 2045 阅读 · 0 评论 -
lintcode(4)——下一个排列、上一个排列
52.下一个排列给定一个整数数组来表示排列,找出其之后的一个排列。样例例1:输入:[1]输出:[1]例2:输入:[1,3,2,3]输出:[1,3,3,2]例3:输入:[4,3,2,1]输出:[1,2,3,4]注意事项排列中可能包含重复的整数先解释一下“字典序”:对于数字1、2、3......n的排列,不同排列的先后关系是从左到右逐...原创 2019-04-19 19:44:35 · 305 阅读 · 0 评论 -
lintcode(14)——翻转链表
35.翻转链表翻转一个链表样例 1:输入: 1->2->3->null输出: 3->2->1->null样例 2:输入: 1->2->3->4->null输出: 4->3->2->1->null挑战在原地一次翻转完成/** * Definition of ...原创 2019-05-03 17:31:12 · 120 阅读 · 0 评论 -
C++——set基本操作总结
set容器中只能存储键,是单纯的键的集合,其中键是不能重复的。set支持大部分的map的操作,但是set不支持下标的操作,而且没有定义mapped_type类型。下面简单总结下set容器的操作:1、set对象的定义和初始化set对象的定义和初始化方法包括:set<T> s;set<T> s(s1);set<T> s(b, e);其中,b和...转载 2019-05-06 10:45:51 · 3380 阅读 · 0 评论 -
lintcode(12)——最小子串覆盖
32.最小子串覆盖给定一个字符串source和一个目标字符串target,在字符串source中找到包括所有目标字符串字母的最短子串。样例例1:输入:""""输出:""例2:输入:"ADOBECODEBANC""ABC"输出:"BANC"挑战要求时间复杂度为O(n)说明在答案的子串中的字母在目标字符串中是否需要具有相同的顺序?——...原创 2019-04-30 18:20:31 · 887 阅读 · 0 评论 -
C++虚继承下的内存模型
对于普通继承,基类子对象始终位于派生类对象的前面(也即基类成员变量始终在派生类成员变量的前面),而且不管继承层次有多深,它相对于派生类对象顶部的偏移量是固定的。请看下面的例子: obj_a、obj_b、obj_c、obj_d 的内存模型如下所示 A 是最顶层的基类,在派生类 B、C、D 的对象中,A 类子对象始终位于最前面,偏移量是固定的,为 0。b1、b2 是派生类 B ...原创 2019-05-27 16:15:25 · 2010 阅读 · 0 评论 -
C++中虚函数工作原理和(虚)继承类的内存占用大小计算
一、虚函数的工作原理虚函数的实现要求对象携带额外的信息,这些信息用于在运行时确定该对象应该调用哪一个虚函数。典型情况下,这一信息具有一种被称为 vptr(virtual table pointer,虚函数表指针)的指针的形式。vptr 指向一个被称为 vtbl(virtual table,虚函数表)的函数指针数组,每一个包含虚函数的类都关联到 vtbl。当一个对象调用了虚函数,实...原创 2019-05-27 10:50:29 · 289 阅读 · 0 评论 -
深度探索C++对象模型
深度探索C++对象模型什么是C++对象模型: 语言中直接支持面向对象程序设计的部分. 对于各个支持的底层实现机制. 抽象性与实际性之间找出平衡点, 需要知识, 经验以及许多思考.导读这本书是C++第一套编译器cfront的设计者所写. 了解C++对象模型, 有助于在语言本身以及面向对象观念两方面层次提升. explicit(明确出现于C++程序代码). implici...转载 2019-05-27 08:57:05 · 173 阅读 · 0 评论 -
C++对象模型
何为C++对象模型?C++对象模型可以概括为以下2部分:1.语言中直接支持面向对象程序设计的部分2.对于各种支持的底层实现机制语言中直接支持面向对象程序设计的部分,如构造函数、析构函数、虚函数、继承(单继承、多继承、虚继承)、多态等等,这也是组里其他同学之前分享过的内容。第一部分这里我简单过一下,重点在底层实现机制。在c语言中,“数据”和“...转载 2019-05-17 14:39:28 · 118 阅读 · 0 评论 -
C++——list基本操作总结
头文件#include<list>声明一个int型的list:list<int> a;1、list的构造函数list<int>a{1,2,3}list<int>a(n) //声明一个n个元素的列表,每个元素都是0list<int>a(n, m) //声明一个n个元素的列表,每个元素都是mlist<...转载 2019-05-12 14:24:48 · 880 阅读 · 0 评论 -
C++——堆排序
堆排序的基本思想是:将待排序序列构造成一个大顶堆,此时,整个序列的最大值就是堆顶的根节点。将其与末尾元素进行交换,此时末尾就为最大值。然后将剩余n-1个元素重新构造成一个堆,这样会得到n个元素的次小值。如此反复执行,便能得到一个有序序列了#include <iostream>#include <cstdlib>using namespace std;...原创 2019-05-15 18:11:02 · 169 阅读 · 0 评论 -
lintcode(17)——子集
17.子集给定一个含不同整数的集合,返回其所有的子集。样例 1:输入:[0]输出:[[],[0]]样例 2:输入:[1,2,3]输出:[[3],[1],[2],[1,2,3],[1,3],[2,3],[1,2],[]]挑战你可以同时用递归与非递归的方式解决么?注意事项子集中的元素排列必须是非降序的,解集必须不包含重复的子集。非递归:...原创 2019-05-07 15:49:32 · 240 阅读 · 0 评论 -
lintcode(16)——带重复元素的全排列
16.带重复元素的排列给出一个具有重复数字的列表,找出列表所有不同的排列。样例 1:输入:[1,1]输出:[ [1,1]]样例 2:输入:[1,2,2]输出:[ [1,2,2], [2,1,2], [2,2,1]]挑战使用递归和非递归分别完成该题。class Solution {private: void hel...转载 2019-05-06 16:46:09 · 307 阅读 · 0 评论 -
lintcode(19)——二叉查找树中搜索区间
11.二叉查找树中搜索区间给定一个二叉查找树和范围[k1, k2]。按照升序返回给定范围内的节点值。样例 1:输入:{5},6,10输出:[] 5它将被序列化为 {5}没有数字介于6和10之间样例 2:输入:{20,8,22,4,12},10,22输出:[12,20,22]解释: 20 / \ 8 ...原创 2019-05-08 21:00:33 · 332 阅读 · 0 评论 -
C++ 二叉查找树
一、概念 二叉查找树(Binary Search Tree),又被称为二叉搜索树。它是特殊的二叉树:对于二叉树,假设x为二叉树中的任意一个结点,x节点包含关键字key,节点x的key值记为key[x]。如果y是x的左子树中的一个结点,则key[y] <= key[x];如果y是x的右子树的一个结点,则key[y] >= key[x]。那么,这棵树就是二叉查找树。如下图所...原创 2019-05-08 20:53:35 · 458 阅读 · 0 评论 -
lintcode(13)——N皇后问题
33.N皇后问题n皇后问题是将n个皇后放置在n*n的棋盘上,皇后彼此之间不能相互攻击。给定一个整数n,返回所有不同的n皇后问题的解决方案。每个解决方案包含一个明确的n皇后放置布局,其中“Q”和“.”分别表示一个女王和一个空位置。例1:输入:1输出: [["Q"]]例2:输入:4输出:[ // Solution 1 [".Q..", "....原创 2019-05-03 15:34:34 · 2578 阅读 · 0 评论 -
lintcode(9)——交叉字符串
29.交叉字符串给出三个字符串:s1、s2、s3,判断s3是否由s1和s2交叉构成。Example 1:Input:"aabcc""dbbca""aadbbcbcac"Output:trueExample 2:Input:"""""1"Output:falseExample 3:Input:"aabcc""dbbca""aadbb...原创 2019-04-28 16:00:00 · 211 阅读 · 0 评论 -
C++双向循环链表
#include <iostream>using namespace std;class Node{ public: Node *next; Node *previous; int element; Node(int element,Node *next,Node *previous){ this->element=element; this->ne...原创 2019-03-08 19:48:21 · 1298 阅读 · 0 评论 -
快速排序运用
题目:在数组中找到第k大的元素样例:给出数组 [9,3,2,4,8],第三大的元素是 4给出数组 [1,2,3,4,5],第一大的元素是 5,第二大的元素是 4,第三大的元素是 3,以此类推要求:要求时间复杂度为O(n),空间复杂度为O(1)一、冒泡排序(平均时间复杂度为 )(1)C++程序:class Solution { public: ...原创 2019-01-09 19:04:32 · 475 阅读 · 0 评论 -
二叉树的DFS和BFS
深度优先搜索(Depth First Search)是沿着树的深度遍历树的节点,尽可能深的搜索树的分支。以下面二叉树为例,深度优先搜索的顺序为:ABDECFG。DFS是先访问根结点,然后遍历左子树接着是遍历右子树,因此我们可以利用堆栈的先进后出的特点,现将右子树压栈,再将左子树压栈,这样左子树就位于栈顶,可以保证结点的左子树先与右子树被遍历。 广度优先搜索(Breadth ...原创 2019-01-11 14:18:56 · 3145 阅读 · 0 评论 -
旋转字符串
旋转字符串给定一个字符串和一个偏移量,根据偏移量旋转字符串(从左向右旋转)样例对于字符串 "abcdefg".offset=0 => "abcdefg"offset=1 => "gabcdef"offset=2 => "fgabcde"offset=3 => "efgabcd"挑战在数组上原地旋转,使用O(1)的额外空间原创 2019-01-10 21:39:03 · 1150 阅读 · 0 评论 -
归并排序运用
归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。 归并操作的工作原理如下: 第一步:申请空间,使其大小为两个已经排序序列...原创 2019-01-10 14:08:17 · 172 阅读 · 0 评论 -
C++名字空间详解
1.名字空间的由来名字空间(namespace)是由标准C++引入的,是一种新的作用域级别。原来C++标识符的作用域分为三级:代码块({…}和函数体)、类域和全局作用域。如今,在类作用域和全局作用域之间,C++标准又添加了名字空间域这一个作用域级别。命名空间是ANSIC++引入的可以由用户命名的作用域,用来处理程序中常见的同名冲突。2.名字空间的作用名字空间的作用主要是为了解决日益严重的名称冲突问...转载 2018-04-25 14:44:13 · 475 阅读 · 0 评论 -
C++ 模板的显示具体化
C++ 没有办法限制类型参数的范围,我们可以使用任意一种类型来实例化模板。但是模板中的语句(函数体或者类体)不一定就能适应所有的类型,可能会有个别的类型没有意义,或者会导致语法错误。例如有下面的函数模板,它用来获取两个变量中较大的一个:template<class T> const T& Max(const T& a, const T& b){ retur...转载 2018-04-23 10:44:34 · 394 阅读 · 0 评论 -
lintcode(6)——最大子数组
41.最大子数组给定一个整数数组,找到一个具有最大和的子数组,返回其最大和。样例1:给出数组[−2,2,−3,4,−1,2,1,−5,3],符合要求的子数组为[4,−1,2,1],其最大和为6样例2:给出数组[1,2,3,4],符合要求的子数组为[1,2,3,4],其最大和为10挑战要求时间复杂度为O(n)注意事项子数组最少包含一个数方法一:class...原创 2019-04-26 20:40:40 · 197 阅读 · 0 评论 -
lintcode刷题——两数之和、三数之和、四数之和、最接近的三数之和
56.两数之和给一个整数数组,找到两个数使得他们的和等于一个给定的数target。你需要实现的函数twoSum需要返回这两个数的下标, 并且第一个下标小于第二个下标。注意这里下标的范围是 0 到n-1。样例Example1:numbers=[2, 7, 11, 15], target=9return [0, 1]Example2:numbers=[15, 2, 7,...原创 2019-04-17 17:15:05 · 249 阅读 · 0 评论 -
C++动态规划算法
基本概念 动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划(DP)。基本思想与策略基本思想与分治法类似,也是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。在求解任一子问题时,列出各种可能的局...原创 2019-04-28 15:49:50 · 2631 阅读 · 0 评论 -
C++之string类型详解
之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为它和前者比较起来,不必担心内存是否足够、字符串长度等等,而且作为一个泛型类出现,它集成的操作函数足以完成我们大多数情况下(甚至是100%)的需要。我们可以用 = 进行赋值操作,== 进行比较,+ 做串联等。我们尽可以把它看成是C++的基本数据类型。C++中对于strinig的定义为:typedef basic_s...转载 2019-04-19 10:48:49 · 350 阅读 · 0 评论 -
C++栈实现
1、栈(Stack)是一种线性存储结构,它具有如下特点:(1)栈中的数据元素遵守“先进后出"(First In Last Out)的原则,简称FILO结构。(2)限定只能在栈顶进行插入和删除操作。2、栈的相关概念:(1)栈顶与栈底:允许元素插入与删除的一端称为栈顶,另一端称为栈底。(2)压栈:栈的插入操作,叫做进栈,也称压栈、入栈。(3)弹栈:栈的删除操作,也叫做出栈。...转载 2019-04-28 11:02:57 · 2151 阅读 · 0 评论 -
C++队列实现
一、相关定义原理:queue队列也是一个线性存储表,元素数据的插入在表的一端进行,在另一端删除,从而构成了一个先进先出FIFO(FirstInFirstOut)表。队头&队尾:插入一端称为队尾,删除一端称为队首。C++队列是一种容器适配器,默认使用双端队列deque来实现,将deque容器转换为queue容器。当然,也可以利用其他合适的序列容器作为底层实现que...原创 2019-04-28 10:51:30 · 2372 阅读 · 3 评论 -
杂耍算法
杂耍算法步骤:1)先将x[0]移到临时变量t中2)将x[i]移动到x[0]中,x[2i]移动到x[i]中,依次类推3)将x中的所有下标都对n取模,直到我们又回到从x[0]中提取元素。不过这时我们从t中提取元素,结束。问题描述:请将一个具有n个元素的一维向量x向左旋转i个位置。例如,假设n=8, i=3,那么向量abcdefgh旋转之后得到向量defghabc。...原创 2019-04-28 10:19:14 · 543 阅读 · 0 评论 -
lintcode(3)——翻转字符串中的单词、转换字符串到整数
53.翻转字符串中的单词给定一个字符串,逐个翻转字符串中的每个单词。样例样例 1: 输入: "the sky is blue" 输出: "blue is sky the" 样例解释: 返回逐字反转的字符串.样例 2: 输入: "hello world" 输出: "world hello" 样例解释: 返回逐字反转的字符串.说明单词的...原创 2019-04-18 20:03:42 · 198 阅读 · 0 评论 -
辗转相除法求最大公约数
辗转相除法, 又名欧几里德算法(Euclidean algorithm),是求最大公约数的一种方法。它的具体做法是:用较大数除以较小数,再用出现的余数(第一余数)去除除数,再用出现的余数(第二余数)去除第一余数,如此反复,直到最后余数是0为止。如果是求两个数的最大公约数,那么最后的除数就是这两个数的最大公约数。两个数的最大公约数是指能同时整除它们的最大正整数。设两数为a、b(a≥b),求...原创 2019-04-28 10:19:33 · 25685 阅读 · 0 评论