C++
TANGYRun
学习是一种习惯和坚持,越努力越幸运
展开
-
哈希结构以及用哈希结构实现unordered_map和unordered_set
哈希的概念unordered系列的关联式容器之所以效率比较高,是因为底层使用了哈希结构。那么问题来了,什么是哈希呢?顺序结构和平衡树中,元素关键码与其存储位置之间没有对应关系,因此在查找一个元素时,必须要经过关键码的多次比较。顺序查找时间复杂度为O(N),平衡树中为树的高度,即O(logN),搜索的效率取决于搜索过程中元素的比较次数。理想的搜索方法:不经过任何比较,一次直接从表中得到要搜索的...原创 2020-02-12 15:37:23 · 681 阅读 · 0 评论 -
set和map的底层模拟实现
STL总共实现了两种不同结构的管理式容器:树型结构与哈希结构。树型结构的关联式容器主要有4种:map、set、multimap、multiset。这四种容器的共同点是:使用平衡搜索树(红黑树)作为其底层结构,容器中的元素是一个有序的序列。1.map的介绍map是关联容器,它是按照特定的次序,即按照key值来比较,存储有键值key和值value组合而成的元素。 在map中,键值key通常...原创 2020-02-09 22:52:03 · 931 阅读 · 0 评论 -
用C++实现红黑树的插入操作以及红黑树的验证
1.红黑树的概念红黑树是一种二叉搜索树,并且每个结点上增加了一个存储表示结点的颜色,可以是Red或Black。通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径的长度长出两倍,因而是近似平衡的。2.红黑树的性质(重要)每个结点的颜色不是红色就是黑色 根结点的颜色是黑的 如果一个结点是红的,则它的两个孩子结点是黑的(意思是不可能存在连续的红结点...原创 2020-02-07 16:29:34 · 448 阅读 · 0 评论 -
C++中栈的运用(OJ题)
最小栈设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。push(x)-- 将元素 x 推入栈中。 pop()-- 删除栈顶的元素。 top()-- 获取栈顶元素。 getMin() -- 检索栈中的最小元素。示例:MinStack minStack = new MinStack();minStack.push(-2);minStac...原创 2019-11-17 14:45:58 · 555 阅读 · 0 评论 -
stack、queue、priority_queue的模拟实现
stack的模拟实现:#pragma once#include<iostream>#include<vector>using namespace std;template<class T, class Container = vector<T>>class Stack{public: Stack() {} void Push...原创 2019-03-16 17:07:01 · 156 阅读 · 0 评论 -
二叉树的前、中、后序【C++】
前序遍历:递归方法:class Solution {public: vector<int> v; void preorder(TreeNode* root) { if(root == nullptr) return ; v.push_back(root->val); pre...原创 2019-03-17 18:49:25 · 173 阅读 · 0 评论 -
多态及其基本原理
多态的概念多态,通俗来说就是多种形态,具体就是去完成某个行为或功能,当不同的对象去完成时会产生出不同的状态。比如,乘火车买票这个行为,当普通人这个对象买票时,买的是全价;当学生这个对象买票时,买的是半价;军人这个对象买票时,是优先买票。多态是在不同继承关系的类对象,去调用同一个函数,产生了不同的行为。比如Student继承了Person,Person对象买全票价,Student对象买半票价...原创 2019-03-25 22:48:27 · 3649 阅读 · 2 评论 -
C++中的继承
继承的概念C++中的继承机制是面向程序设计使代码可以复用的最重要的手段,它可以允许程序员在保持类特性的基础上进行扩展,增加类的功能,这样产生的新类,称为派生类。继承呈现了面向对象程序设计的层次结构,继承是类设计层次的复用。简单举一个例子:#include<iostream>#include<string>using namespace std;class...原创 2019-03-22 21:00:39 · 125 阅读 · 0 评论 -
C++模板进阶
模板参数分为类类型形参和非类型形参。类类型形参:出现在模板参数列表中,跟在class或者typename之后类的参数类型名称。非类型形参:用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用。注意:浮点数、类对象以及字符串是不允许作为非类型模板参数的。 非类型的模板参数必须在编译期间就能确定结果。模板的特化通常情况下,使用模板可以实现一些与类型...原创 2019-03-29 21:17:12 · 171 阅读 · 0 评论 -
深度解析继承(虚拟继承)
继承分为:单继承、多继承和菱形继承单继承:一个子类只有一个直接父类时称这个继承关系为单继承。多继承:一个子类有两个或以上直接父类时称这个继承关系为多继承。菱形继承:菱形继承是多继承的一种特殊情况。有两个子类继承同一个父类,而又有子类同时继承这两个子类。通过上面的图可以看出菱形继承有数据冗余和二义性的问题,在Assistant的对象中Person成员会有两份。以...原创 2019-03-23 17:48:37 · 1628 阅读 · 0 评论 -
深度理解程序内存分区中的栈空间和堆空间
栈:由操作系统自动分配释放,用于存放函数的参数值、局部变量等。它的的操作方式类似于数据结构中的栈,都是后进先出。例如:int main(){ int a;//栈 char arr[] = "abcd";//栈 char *p;//栈}函数中定义的局部变量按照先后定义的顺序依次压入栈中,栈的内存伸展方向是向下的,即由高到低,因此后定义的变量地址要低于先定义的变量...原创 2019-03-27 16:23:56 · 2757 阅读 · 0 评论 -
智能指针
学习智能指针,首先我们要知道为什么需要智能指针?有时候,我们的代码中有malloc或new开辟新空间的情况,如果没有管理好空间,例如在程序结束时没有及时释放空间,久而久之就会存在内存泄漏的问题。除此之外,还有异常安全问题,如果在malloc和free之间存在抛异常,同样会造成内存泄漏,这种问题叫异常安全。这时候就需要智能指针,智能指针在C++没有垃圾回收器的环境下,可以很好的解决异常安全等带来...原创 2019-04-07 19:14:28 · 168 阅读 · 0 评论 -
AVL数的实现(C++)
二叉搜索树虽然可以加快查找效率,但当数据有序或接近有序时,二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下。因此,当向二叉搜索树中插入新结点后,如果能保证每个结点的左右子树高度之差的绝对值不超过1(需要对树中的结点进行调整),即可降低树的高度,从而减少平均搜索长度。一颗AVL树或是空树,或是具有以下性质的二叉搜索树:它的左右子树都是AVL数 它的左右子树高度之差(简称...原创 2019-04-23 22:32:26 · 1776 阅读 · 0 评论 -
二叉搜索树的实现(C++)
二叉搜索树又称为二叉排序树,它可能是一棵空树,亦或是一棵具有以下性质的二叉树:若它的左子树不为空,则左子树上所有结点的值都小于根结点的值。 若它的右子树不为空,则右子树上所有结点的值都大于根结点的值。 它的左右子树也分别为二叉搜索树。二叉搜索树的操作1.二叉搜索树的查找实现思路:若结点不为空:如果结点的值key == 查找的key,返回该结点;如果结点的值key ...原创 2019-04-19 21:41:46 · 2412 阅读 · 0 评论 -
list的模拟实现
什么是listlist是STL标准模板库中的一个容器,它实质上是一个带头双向循环链表。这样的好处是:插入/删除数据时,不用判断链表是否为空,并且遍历的时候找尾也很容易,只需要用_head->_prev就能实现。迭代器迭代器的作用就是为了让容器的访问像指针一样可以实现++,-- ,解引用,->,以及重载 !=,==的比较符。迭代器有两种实现方式: 1...原创 2019-03-11 14:55:23 · 264 阅读 · 0 评论 -
细谈深浅拷贝问题
浅拷贝浅拷贝:也称位拷贝,编译器只是将对象中的值拷贝过来。如果对象中管理资源,最后就会导致多个对象共享同一份资源,当一个对象销毁时就会将该资源释放掉,而此时另一些对象不知道该资源已经被释放,以为还有效,所以当继续对资源进行操作时,就会发生了访问违规。下面来看一段代码:String(const char* pstr = ""):_pstr(new char[strlen(pstr)+1...原创 2019-02-26 20:54:51 · 452 阅读 · 0 评论 -
vector的模拟实现
上一节博客讲述了vector常见接口的使用,今天主要是对vector这些接口进行模拟实现,下面是相关代码:#include<iostream>#include<string>#include<assert.h>using namespace std;namespace TY{ template<class T> class Vec...原创 2019-03-05 21:53:01 · 181 阅读 · 0 评论 -
C++ 计算日期到天数转换
根据输入的日期,计算是这一年的第几天。。详细描述:输入某年某月某日,判断这一天是这一年的第几天?。接口设计及说明:/*****************************************************************************Description : 数据转换Input Param : year 输入年份Month 输入月份Da...原创 2019-01-17 17:23:58 · 5013 阅读 · 1 评论 -
细谈C++中的“类和对象”
通过C语言的学习,我们了解到C语言是面向过程的,关注的是过程,分析求解问题的步骤,通过函数调用逐步解决问题。而现在所学的C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间交互完成。下面我们将一一看到C++中类和对象的相关运用。 类的定义class className{ //主体:由成员函数和成员变量组成};//后面有分号,和struct和union类似...原创 2019-01-17 20:53:13 · 215 阅读 · 0 评论 -
C++ 字符串相加
给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。注意:1.num1 和num2 的长度都小于 5100.2.num1 和num2 都只包含数字 0-9.3.num1 和num2 都不包含任何前导零。4.不能使用任何內建 BigInteger 库,也不能直接将输入的字符串转换为整数形式。解题思路:本题主要采用循环相加,按加法运算规则的进位思想。先依次定义两个字符串的...原创 2019-01-23 18:00:04 · 15275 阅读 · 0 评论 -
C++ 反转字符串中的单词 III
给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。示例 1:输入: “Let’s take LeetCode contest”输出: “s’teL ekat edoCteeL tsetnoc”注意:在字符串中,每个单词由单个空格分隔,并且字符串中不会有任何额外的空格。利用迭代器遍历的方式class Solution {public: str...原创 2019-01-23 18:04:18 · 1018 阅读 · 0 评论 -
C/C++内存管理和内存泄漏
首先我们来看内存分布#include&amp;lt;iostream&amp;gt;using namespace std;int globalval = 1;static int staticglobalval = 1;void Test(){ static int staticval = 1; int locaval = 1; int num[10] = { 1, 2, 3, 4 }; ...原创 2019-01-18 16:47:41 · 285 阅读 · 0 评论 -
C++入门知识点
学完了C语言之后,刚接触C++相对而言就比较容易了,因为C++兼容了C语言的语法规则,学完了C语言就相当于把C++的内容学了近三分之一。下面就让我们一步一步学习C++。C++关键字C++的关键字比C语言多了一大半,先初步了解一下,在以后我们会依次更深层次的学习。命名空间在C/C++中,变量、函数和类都是大量存在的,而这些变量、函数、类的名称都将存在于全局作用域中,就有可能导致许多冲突,...原创 2019-01-14 18:10:45 · 244 阅读 · 0 评论 -
C++ 模板初阶
函数模板在了解函数模板之前我们实现一个通用的交换函数,想到的办法就是函数重载,但函数重载有几个不好的地方:1.重载的函数只是参数的类型不同,代码的复用率比较低,只要有新类型出现时,就需要增加对应的函数。2.代码的可维护性较低,一个出错可能所有的重载都出错了。模板的出现就是告诉编译器一个模子,编译器根据不同的类型利用模子来生成代码。函数模板:函数模板代表了一个函数家族,该函数模板与类型...原创 2019-01-20 18:05:06 · 154 阅读 · 0 评论 -
string类的一些常见面试题
1.反转字符串编写一个函数,其作用是将输入的字符串反转过来。示例 1:输入: “hello”输出: “olleh”示例 2:输入: “A man, a plan, a canal: Panama”输出: “amanaP :lanac a ,nalp a ,nam A”class Solution {public: string reverseString(string s...原创 2019-01-20 19:09:08 · 673 阅读 · 0 评论 -
string类对象的常见操作
在C语言中,字符串是以’\0’结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,而且底层空间需要用户自己管理,稍不留神可能会越界访问。 标准库中的string类1) string是表示字符串的字符串类。2)该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。3) string在底层实际是:bas...原创 2019-01-21 20:16:41 · 283 阅读 · 0 评论 -
C++ 实现Date类的相关操作
#include&lt;iostream&gt;using namespace std;class Date{public: //带参构造函数 /*Date(int year = 2019,int month = 1,int day = 15) { _year = year; _month = month; _day = day; }*/ //拷贝构造函数 Date...原创 2019-01-16 16:26:39 · 450 阅读 · 0 评论 -
C++中 auto关键字和基于范围的for循环
auto关键字在C++11中,auto的定义为:auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导得到。#include&lt;iostream&gt;using namespace std;int TestAuto(){ return 10;}int main(){ int a = 10; auto b =...原创 2019-01-16 18:06:34 · 2421 阅读 · 0 评论 -
C++ string类的模拟实现
string类的模拟实现要实现几大操作:1.string类对象的常见构造:构造函数、拷贝构造、赋值操作、析构函数2.modify修改操作:PushBack、Append、operator+=、Insert、Erase、Find3.string类对象的capacity容量操作:Resize、Reserve、Clear、Size、Capacity、Empty4.access下标访问:opera...原创 2019-01-22 19:20:39 · 802 阅读 · 0 评论 -
vector常见接口的使用以及迭代器失效问题
对vector的介绍1.vector是表示可变大小数组的序列容器。2.跟数组一样,vector也采用连续的存储空间来存储元素,这就意味着可以采用下标对vector的元素进行访问,和数组一样高效。但它又不像数组,它的大小可以动态改变,而且它的大小会被容器自动处理。3.本质讲,vector使用动态分配数组来存储它的元素,当有新元素插入的时候,这个数组需要被重新分配大小,为了增加存储空间,做法就...原创 2019-03-01 17:16:05 · 325 阅读 · 0 评论 -
用类和对象求1+2+3+...+n的值
求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)class Solution {public: class Sum //定义一个Sum的内部类 { public: Sum()//构造函数 { sum += i; ...原创 2019-01-17 16:39:43 · 365 阅读 · 0 评论