
C++ / 数据结构
文章平均质量分 74
包括C++11 的内容
ly_1115
随遇而安,没必要逞强。
展开
-
【idea使用问题】使用git的update更新代码时提示 Can‘t Update No tracked branch configured for branch master or......
使用idea的update提示Can't Update No tracked branch configured for branch master or branch ...原创 2022-02-14 18:03:52 · 6476 阅读 · 0 评论 -
自增++与自减--运算符如何使用?
在程序编程中,加1和减1是数值变量最常见的操作。因此自增++ 与自减-- 运算符的使用,也是我们需要掌握的。自增++ 和自减-- 的用法分两种情况:例如:前缀形式:++i;- -i(在表达式里使用改变后的值)后缀形式:i++;i- -(在表达式里使用改变后的值)以上两种形式使变量本身的值改变是一样的,但是对使用它们的表达式会产生不一样的结果,在下面的示例里可以清晰的看到区别。原创 2022-02-10 11:47:52 · 1761 阅读 · 0 评论 -
【C++11】lambda 表达式
函数指针,仿函数,lambda 表达式的异同:函数指针:类型定义难以理解例如:bool greater_func1(int l, int r){return l > r;}bool(*f1)(int ,int )=greater_func1;cout << f1(1, 2) << endl;仿函数(C++98):先定义好再用,运算符重载例如:...原创 2019-06-28 11:51:29 · 198 阅读 · 1 评论 -
【C++11】右值引用详解
C++中的 左值和右值简单地说:左值 就是赋值符号 = 左边的值,是一个可以被改变的值但赋值符号 = 右边的值不一定是 右值 ,右值是指不可以被改变的值(例如:常量、表达式返回值、临时对象)移动语义将一个对象中的资源转移到另一个对象中的方式,称为移动语义。在C++11中如果需要实现移动语义则必须使用右值引用。我将通过下面的图解帮助大家加深对移动语义的理解——...原创 2019-06-28 11:08:43 · 484 阅读 · 1 评论 -
【C++】C/C+内存管理
【本节内容】C/C++ 内存分配C/C++ 内存管理operator new和operator deletenew和delete实现原理malloc/free和new/delete的区别和联系1.C/C++ 内存分配对什么数据应该存在哪里,我再做一个更详细的分析(地址由高到低)内核空间:用户代码不能进行读写在32位机器中,程序的内存一般都是4G。其中0~3G由用户自由操作...原创 2019-04-23 21:14:07 · 397 阅读 · 1 评论 -
【C++】strlen 和sizeof 的区别(小结)
strlen和sizeof 区别一、sizeof 运算符:计算所占的字节大小sizeof()是运算符,其值在编译时 就已经计算好了,参数可以是数组、指针、类型、对象、函数等。它的功能是:获得保证能容纳实现所建立的最大对象的字节大小。由于在编译时计算,因此sizeof不能用来返回动态分配的内存空间的大小。实际上,用sizeof来返回类型以及静态分配的对象、结构或数组所占的空间,返回值跟对象、...原创 2019-04-23 22:18:17 · 18346 阅读 · 10 评论 -
【C++】reserve( ) 和resize( ) 函数的区别(小结)
**显然,** reserve和resize的共同点如下:- 当 填写的n值<=当前值 时,都不会缩减容器本身的容量,即对原内存空间并无影响。- 当 填写的n值>当前值 时,都会增大容器本身的容量 即capacity会变化。reserve和resize的区别点如下:- reserve在不能改变容器容量时,什么都不做;reserve在能改变容器容量时,只会增加capacity即容器冗余量,但容器的size不会变化。- resize在不能改变容器容量的时候,有可能增加/减少了元素个数即size(原创 2019-04-30 18:46:31 · 3554 阅读 · 1 评论 -
【C++】二叉搜索树
**二叉搜索树又叫二叉排序树,它或者是一颗空树**,或者是具有以下性质的二叉树: - 若它的左子树不为空,则左子树上的所有结点都小于根节点上的值 - 若它的右子树不为空,则右子树上的所有结点都大于根节点上的值 - 它的左右子树也分别是二叉搜索树原创 2019-05-01 17:13:42 · 4337 阅读 · 6 评论 -
【C++】AVL树的完整实现
#define _CRT_SECURE_NO_WARNINGS 1#pragma once#include <stdlib.h>#include <iostream>#include <assert.h>using namespace std;namespace LY{ template <class K, class V> ...原创 2019-05-04 19:05:24 · 2539 阅读 · 0 评论 -
【C++】STL进阶-- 树形结构的关联式容器(set和multiset)
我在上篇博客中讲到另外两个关联式容器:STL进阶之树形结构的关联式容器 —— map和multimap6. set7. multiset8.四种关联式容器的比较原创 2019-04-17 23:44:06 · 716 阅读 · 0 评论 -
【C++】map统计元素个数并且排序,用三种方法实现
我在上篇博客中讲到,map的主要特点是 会将所有键值对按key 值升序排列 且map中的key值不允许重复, 想了解关于map 和multimap 更多知识的可以查看下面的这篇博客:STL进阶之树形的关联式容器——map下面我们就应用map的三种接口实现和map有关的排序1. find(key) + iterator insert(iterator position,make_pair())...原创 2019-04-17 23:17:55 · 5108 阅读 · 3 评论 -
【C++】STL进阶-- 树形结构的关联式容器(map和multimap)
1.理解键值对2.map 的使用3.multimap 的使用4.底层结构## 1.键值对键值对是用来表示一对一的数据映射关系的一种结构,该结构中一般只包含两个成员变量key和value,key代表关键字,value代表与key对应的信息值。我们生活中有许多这样的对应关系,例如英汉互译字典就是典型的<k,v>模型。每个中文词语与英文单词就存在着一一映射的关系,我们用其他数据结构描述出这样的关系可能需要很多辅助,但是用map就能轻易的进行描述。这就是键值对为我们**在用编程处理一对一数据的时候,提原创 2019-04-17 00:21:24 · 989 阅读 · 2 评论 -
【C++】这些函数不能声明为虚函数的原因
内联函数:原创 2019-04-10 00:02:35 · 1456 阅读 · 0 评论 -
【C++】C++的类型转换
【本节内容】1. C语言中的类型转换2. C++强制类型转换(explicit关键字阻止隐式转换的发生)3. RTTI1.C语言中的类型转换首先我们看一段代码了解C语言中的类型转换void Test() { int i = 1; // 隐式类型转换 double d = i; printf("%d, %.2f\n" , i, d); //...原创 2019-04-08 20:07:16 · 298 阅读 · 0 评论 -
【C++】使用友元/内部类时常见的问题(总结)
友元函数的总结我在之前的博客friend友元和内部类 中讲到过,有需要的可以查看:https://blog.youkuaiyun.com/ly_6699/article/details/88079162我总结了主要的几个知识点:1)C++引用友元函数是为该类提供一个(除自己以外)的访问窗口。2)这个友元函数并不是该类的成员函数,它是一个定义在类外的普通函数,只是在类中声明该函数可以直接访问类中的pri...原创 2019-04-08 17:00:46 · 1415 阅读 · 0 评论 -
【C++】智能指针 RAII
1. 智能指针的使用和原理: RAII+重载操作符 * 和 -> 2. 三种智能指针的介绍 auto_ptr:原理- 管理权转移,不足- 拷贝后前指针悬空会导致出现野指针,禁止使用 unique_ptr:原理- 禁止任何拷贝,不足- 无法完成拷贝,可鼓励使用 shared_ptr:原理- 通过引用计数实现资源共享,不足- 会出现线程安全和循环引用的问题,不过循环引用问题的解决可用weak_ptr原创 2019-04-07 22:43:12 · 418 阅读 · 0 评论 -
【C++】异常
【本节目标】1.C语言传统的处理错误的方式2.C++异常概念3.异常的用法4.异常体系5.异常的优缺点1.C语言传统的处理错误的方式传统的错误处理机制:终止程序,如assert,缺陷:用户难以接受只发生小错误时就终止程序。返回错误码,缺陷:需要程序员根据errno表去查找对应的错误。C 标准库中setjmp和longjmp组合。这个不是很常用实际中C语言基本都是使用返回错误...原创 2019-04-07 14:39:39 · 185 阅读 · 2 评论 -
【C++】多态(二)--单继承和多继承的虚函数表
在上篇博客 多态(一):https://blog.youkuaiyun.com/ly_6699/article/details/88904626 中,我讲到了多态的概念及实现,虚函数的重写,抽象类等概念,这里我就继续讲多态的原理,及单继承和多继承的虚函数表,前面的内容大家可点击链接去看哦。5.多态的原理...原创 2019-03-31 13:51:57 · 489 阅读 · 0 评论 -
【C++】多态(一)--重载,重写,重定义
【本节内容】1.多态的概念2.多态的定义及实现3.抽象类4.C++11 override和final1. 多态的概念简单说 多态就是同一个函数表现出的多种形态。具体点 就是当不同的对象去完成某个相同行为时所产生不同的状态。举例:就生活中买票这个行为,当成人去完成时买到全价票,当学生去完成时买到半价票,当儿童去完成时是免费票。2.多态的定义及实现2.1 多态构成的条件1.调用函数...原创 2019-03-30 00:12:11 · 824 阅读 · 0 评论 -
【C++】继承(四)--菱形继承和菱形虚拟继承
继承(一):https://blog.youkuaiyun.com/ly_6699/article/details/88801492继承(二):https://blog.youkuaiyun.com/ly_6699/article/details/88805464继承三:在这节里,我重点讲复杂的菱形继承和菱形的虚拟继承1.单继承一个子类只有一个直接父类时称这个继承关系为单继承。...原创 2019-03-27 23:44:15 · 285 阅读 · 0 评论 -
【C++】继承(三)--友元,静态函数,组合
继承(一):https://blog.youkuaiyun.com/ly_6699/article/details/88801492继承(二):https://blog.youkuaiyun.com/ly_6699/article/details/88805464今天,我们接着前两天的内容继续讲继承。本节内容主要有 继承和友元,继承和静态函数,继承和组合5.继承和友元这里只需要注意一点,友元关系不能继承! 也就...原创 2019-03-27 23:15:22 · 372 阅读 · 0 评论 -
【C++】继承(二)--派生类的默认成员函数
在继承(一):https://blog.youkuaiyun.com/ly_6699/article/details/88801492 这篇博客里,我讲到了继承的概念和定义,基类和派生类对象赋值转换等相关的知识点,有兴趣的可以点链接去看。【本节内容】继承中的作用域派生类的默认成员函数3.继承中的作用域3.1 在继承体系中,基类和派生类都有独立的作用域。3.2 子类和父类有同名成员(成员函数或成员变...原创 2019-03-25 20:37:18 · 632 阅读 · 0 评论 -
【C++】实现一个不能被继承的类
在我的上篇博客里,我讲到继承中的作用域和派生类的默认成员函数,并留下一个问题:怎样实现一个不能被继承的类!这道题的解题思路有两个:1.在C++98 里,我们可以将构造函数私有化,这样派生类无法调用基类的构造函数,便无法继承。具体代码如下:class NonInherit{public://这个函数保证对象在类外可以被访问,但无法被继承 static NonInherit GetIn...原创 2019-03-25 20:29:58 · 211 阅读 · 0 评论 -
【C++】继承(一)--赋值转换
【本节内容】继承的概念及定义基类和派生类对象赋值转换1. 继承1.1概念继承机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生的类叫做派生类(子类),原有类叫做基类(父类)。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。之前我们解除的都是函数复用,而继承属于类设计层次的复用。class Perso...原创 2019-03-25 17:54:36 · 699 阅读 · 0 评论 -
【C++】类创建对象的情况
最近经常在选择题里碰到问:下面程序的类中创建了几个对象的问题,开始做题很头疼,后来稍微总结了一下,发现也并不难。这可能只是一部分,之后有其他类型还会继续更新~或者大家碰到的其他问题,也可以留言给我,一起讨论咯首先,大家都知道构造函数和拷贝构造函数会为类创建对象。1.构造函数很好辨认,类名 对象名;即可创建对象。对构造函数有其他疑惑的宝宝可以参考前面的博客:https://blog.csdn...原创 2019-03-24 23:01:28 · 1152 阅读 · 0 评论 -
【C++】模板初阶--函数模板和类模板
【本节内容】泛型编程函数模板类模板1.泛型编程首先问大家一个问题,如果我们想实现一个通用的交换函数,该怎么做呢?我想大家会想到用重载,将不同类型参数的函数都写出来,这是一个解决的办法,不过emmm…自己看~void Swap(int &left, int &right){ int temp = left; left = right; right = temp;...原创 2019-03-22 23:01:54 · 334 阅读 · 0 评论 -
【C++】模板进阶--类模板特化
【本节内容】非类型模板参数类模板的特化这篇博客的内容可参照我的上篇博客函数模板和类模板,一起学习。1.非类型模板参数模板参数分 类型形参与非类型形参类型形参:出现在模板参数列表中,跟在class或typename之类的参数类型名称。非类型形参:用常量做类(函数)模板的参数,在类(函数)模板中可将该参数当常量使用。 //定义模板类型的静态数组template <class...原创 2019-03-24 16:38:34 · 745 阅读 · 2 评论 -
【C++】vector、list及deque 三种容器总结
在上篇博客里,我讲到了[三种容器适配器]:queue,stack和priority_queue 这里我就简单讲一下我对vector、list及deque 三种容器的理解。下面两篇博客详细的讲解到vector和list的实现原理以及使用,有兴趣的点链接查看;[vector的模拟实现][list模拟实现原创 2019-03-22 17:54:48 · 516 阅读 · 0 评论 -
【C++】queue,stack和priority_queue 三种容器适配器
容器是对类模板的封装,而容器适配器是**对容器的一种再封装**。不同的容器适配器提供不同的函数,使容器的功能得到全新的特定的扩展。(但它和容器是有区别的:容器适配器不支持迭代器和算法,使用起来限制比较大)。标准库提供了三种容器适配器:queue(先进先出),stack(后进先出)和priority_queue(通过自己制定的规则进行排列,默认“<”比较即大数优先极高)。原创 2019-03-19 17:42:47 · 815 阅读 · 0 评论 -
【C++】priority_queue (优先队列)
priority_queue 的介绍1.优先队列的底层是用堆实现的,而且默认大堆。2.优先队列是一种容器适配器,根据严格的若排序标准,它的第一个元素总是它所包含的元素中最大的一个。3.优先队列可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶部的元素)。4.优先队列被实现为容器适配器,容器适配器即将特定容器类封装作为底层容器类,queue 提供一组特定的成员函数来访问其元素,元素从...原创 2019-03-18 23:55:52 · 1680 阅读 · 1 评论 -
【C++】 为什么建议代码尽量不要使用 using namespace std
using namespace std;首先我们要知道,这句代码的意思是:打开std 的标准命名空间。在std 标准空间里,包含了原来的库和头文件。但是在C++ 中因为要使用的STL中有部分名称是没有加下划线的保留标记的,而这些名称如果再用在自己的源代码中会引发未定义的后果。它们提供的内容和相应的旧的C头文件相同,只是内容在 std 中,所以当我们在写成熟的代码的时候,一般不建议将标准命名空...原创 2019-03-18 20:36:52 · 27404 阅读 · 10 评论 -
【C++】类与结构体的区别
我们知道C++中的 struct 对C中的 struct 进行了扩充,它不再是只能用来封装不同类型数据的数据结构了,而是拥有了更多的功能,例如:**可以包含成员函数,可以继承,可以实现多态!!**,这些功能与C++中的类很相似。那么接下来我们解剖一下C++中结构体struct与类class的区别。**struct更适合看成是一个数据结构的实现体,class更适合看成是一个对象的实现体!**原创 2019-03-12 23:38:09 · 32405 阅读 · 8 评论 -
【C++】friend 友元和内部类
[本节内容]友元函数友元类注意:友元提供了一种突破封装的方式,有时提供了便利。但是友元会增加耦合度,破坏了封装,所以友元不宜多用。1.友元函数首先大家看下面的代码:class A{public: A(int a = 10) { _a = a; }private: int _a;};int main(){ A a; cout &amp;amp;lt;&amp;amp;lt; a &原创 2019-03-02 18:01:31 · 734 阅读 · 0 评论 -
【C++】static成员
1 概念声明为static的类成员称为类的静态成员,用static修饰的成员变量称为静态成员变量,用static修饰的成员函数称为静态成员函数。静态成员变量一定要在类外进行初始化。面试题:实现一个类,计算出类内创建了多少个类对象class A{public: A() { ++_count; } A(const A& a) { ++_count; } static int ...原创 2019-03-02 17:14:45 · 168 阅读 · 0 评论 -
【C++】深浅拷贝的认识
[本节内容]浅拷贝与深拷贝的比较1.拷贝拷贝就是我们平时说的复制,就如同“克隆”,用一个已有的对象快速地复制出多个完全相同的对象。一般我们在以下三种情况下会用到对象的复制:1.拷贝构造函数:用一个已有的对象去创建同类的新对象并对它初始化2.对象作为函数的参数进行调用,这时调用此函数时使用的是值传递,也会产生对象的复制3.函数的返回值是类的对象,在函数调用结束时,需要将函数中的对象复制...原创 2019-03-01 19:25:01 · 315 阅读 · 0 评论 -
【C++】类与对象(构造函数二)
[本节内容]再谈构造函数之前博客讲过成员函数默认的构造函数:https://blog.youkuaiyun.com/ly_6699/article/details/878704291.构造函数体赋值在创建对象时,编译器通过调用构造函数...原创 2019-02-25 18:34:43 · 252 阅读 · 0 评论 -
【C++】类与对象(取地址操作符)
[本节内容]1.const 成员2.取地址及const取地址操作符重载1.1 const修饰类的成员函数将const修饰的类成员函数称之为const成员函数,实际const修饰的是该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改。class Date{public: void Display() { cout &lt;&lt; "Display()"...原创 2019-02-25 18:01:09 · 5006 阅读 · 0 评论 -
【C++】类与对象(赋值运算符重载)
[本节内容]赋值运算符重载5.1 运算符重载C++为了增加代码的可读性引入运算符重载,运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数名字以及参数列表,其返回值类型与普通的函数类似。函数名字为:关键字operator 后面接需要重载的运算符符号函数原型:返回值类型operator操作符(参数列表)注意:1)不能通过连接其他符号来创建新的操作符:比如 operator@2)...原创 2019-02-25 16:53:19 · 1809 阅读 · 0 评论 -
【C++】类与对象(拷贝构造函数 )
[本节内容]拷贝构造函数4.1概念只有单个形参,该形参是对本类类型对象的引用(一般用const修饰),在用已存在的类类型创建新对象时由编译器自动调用。4.2特征拷贝构造函数也是特殊的成员函数,其特征如下:1.拷贝构造函数是构造函数的一个重载形式2.拷贝构造函数的参数只有一个且必须使用引用传参,使用传值方式会引发无穷递归调用。class Date{public: Date(in...原创 2019-02-23 13:33:37 · 966 阅读 · 0 评论 -
【C++】类与对象(构造函数)
[本节内容]1.类的6个默认成员函数2.构造函数3.析构函数4.拷贝构造函数5.赋值操作符重载6.默认拷贝构造与赋值运算符重载的问题7.const成员函数8.取地址及const取地址操作符重载1.类的6个默认成员函数如果一个类中什么成员都没有,简称空类。但是空类并不是什么都没有,即使我们不写的情况下,它也会自动生成下面6个默认函数。class Date{};2.构造函数...原创 2019-02-21 23:22:14 · 1254 阅读 · 0 评论