
C++学习阶段
文章平均质量分 83
黎晓舞指
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
(超详细)常见容器的底层实现结构 and 常用接口梳理 and 迭代器失效问题
囊括《 vector , list, dqueue, string, stack, queue ,priority_queue ,map ,unorderedmap,set》<1> vector底层: 数组扩容方式: vs下以2倍速度增长,g++ 下以1.5倍速度增长。 (两种环境下STL的版本不同,前者为PJ版本,后者为SGI版本)初始化方式:(1)vector<int> v; // vector 为空,size = 0,没有任何元素 (2)vector&l原创 2021-04-06 21:49:32 · 299 阅读 · 0 评论 -
C++ STL 常见容器的底层实现结构 and 常用接口梳理 and 迭代器失效问题
一、常见容器的底层实现结构 and 常用接口梳理 and 迭代器失效vector list dqueue string stack queue priority_queue map unordered_map set unordered_set<1> vector底层: 数组扩容方式: vs下以2倍速度增长,g++ 下以1.5倍速度增长。 (两种环境下STL的版本不同,前者为PJ版本,后者为SGI版本)初始化方式: (1)vector<int> v...原创 2021-01-19 19:57:15 · 321 阅读 · 0 评论 -
指针 和 引用的区别
区别:1.指针是一个实体,而引用是一个别名。(程序编译时,将指针和引用添加到符号表时,指针放入的时“指针变量的地址”,而引用则放入的是“所指向对象的地址”。所以说引用不可以改变,而指针可以。)符号表是什么以及它的作用看链接文章: 符号表的作用和地位2.指针的内容可以改变,且可以为空,而引用所对应的值不能发生改变,且不能为空。3.指针 sizeof 得到的是指针类型的大小(32位平台是 4字节,64 为8字节),而 引用sizeof得到的是它所代表的对象的大小。4.指针要想对对象进行操作,需要解引用原创 2020-07-15 11:22:51 · 1506 阅读 · 0 评论 -
C/C++ 函数声明与定义分开的必要性。防止函数重定义的三种方法。
大家都知道,我们在写项目的时候习惯性的将函数声明与定义分开来写,通常函数声明放在.h文件中,函数定义放在.cpp文件中,那么这么做的原因是什么呢?这是我在练习时遇到的一个问题:我有三个文件:a.h文件#include<iostream>using namespace std;void print1(){ cout<<"hello world" <&...原创 2020-04-07 14:26:29 · 5307 阅读 · 1 评论 -
C++实现字符组合 两种方法: 递归 位操作
1、思路:假设我们想在长度为n的字符串中求m个字符的组合。我们先从头扫描字符串的第一个字符。针对第一个字符,我们有两种选择:第一是把这个字符放到组合中去,接下来我们需要在剩下的n-1个字符中选取m-1个字符;第二是不把这个字符放到组合中去,接下来我们需要在剩下的n-1个字符中选择m个字符。这两种选择都很容易用递归实现。#include<iostream>#include<v...原创 2020-04-01 22:18:47 · 1284 阅读 · 0 评论 -
宏定义的优缺点
一、优点提高代码的可读性,方便修改。提高程序的运行效率:使用带参数的宏既代替了函数的功能,有避免了函数入栈和出栈操作,减少了系统的开销,提高了运行的效率。二、缺点1.由于使用宏的时候,只是进行简单的字符替换,不会对类型进行检查,存在安全隐患。2.由于宏是直接替换的,所以会导致代码稍微长一点。3.嵌套定义过多可能会影响程序的可读性,会容易出错。4.边界效应。由于宏定义的时候,其各个分...原创 2020-03-04 15:53:06 · 3504 阅读 · 0 评论 -
红黑树----原理及详细实现过程
1.红黑树的概念红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出两倍,因而是接近平衡的。2.红黑树的性质每个节点不是红色就是黑色根结点是黑色的如果一个结点是红色的,则它的两个孩子是黑色的对于每个节点,从该节点到其后代叶结点的简单路径上,均包...原创 2020-03-03 10:28:49 · 4207 阅读 · 0 评论 -
STL的allocaotr
allocator类是C++的一个模板,它提供类型化的内存分配以及对象的分配和撤销。allocator称为分配器(空间配置器)STL的分配器用于封装STL容器在内存管理上的底层细节。在C++中,其内存配置和释放如下:new运算分两个阶段:(1)调用::operator new配置内存;(2)调用对象构造函数构造对象内容delete运算分两个阶段:(1)调用对象希构函数;(2)掉员工::op...原创 2020-03-02 20:37:32 · 905 阅读 · 0 评论 -
C++ 静态函数与虚函数的区别
经常在网上看到大家在讨论静态函数与虚函数的区别,往往可以看到统一的答案是:静态函数在编译的时候就已经确定运行时机,虚函数在运行的时候动态绑定。虚函数因为用了虚函数表机制,调用的时候会增加一次内存开销。这个答案是正确的,但是一般不懂得虚函数表原理的人,看了可能也是一头头雾水。下面我们就先来说说什么是虚函数表:虚函数表: 当一个类中包含被virtual 关键字修饰的成员函数时,该成员函数就成为了一...原创 2020-03-02 19:57:51 · 4064 阅读 · 2 评论 -
定位new表达式 、内存泄漏、相关问题(如何一次在堆上申请4G的空间?分别设计量个类,一个只能在堆上创建对象,一个只能在栈上创建对象)
定位new表达式定位new表达式是在已分配的原始内存空间中调用构造函数初始化一个对象。使用格式:new (place_address) type或者new (place_address) type(initializer-list)place_address必须是一个指针,initializer-list是类型的初始化列表(无参数是时可省略)使用场景:定位new表达式在实际中一般是配合...原创 2019-10-20 16:36:10 · 354 阅读 · 0 评论 -
malloc/free和 new/delete 的区别
malloc/free和new/delete的共同点是:都是从堆上申请空间,并且需要用户手动释放。不同之处有很多:malloc和free是函数,new和delete是操作符malloc申请的空间不会初始化,new可以初始化malloc申请空间时,需要手动计算空间大小并传递,new只需在其后跟上空间的类型即可malloc的返回值为void*, 在使用时必须强转,new不需要,因为new后...原创 2019-10-20 15:41:50 · 155 阅读 · 0 评论 -
单例模式 -----------《饿汉模式、懒汉模式》 原理,缺陷及改进方法
设计模式:什么是设计模式?设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。使用设计模式的目的:为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。 设计模式使代码编写真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。今天我们要看的是设计模式的一种“单例模式”单例模式一个类只能创建一个对象,即单例模式。该模式可以保...原创 2019-10-20 15:34:05 · 1020 阅读 · 0 评论 -
C++11特性《 右值引用-<完美转发>、lambda表达式》
1.右值引用1.1移动语义如果一个类中涉及到资源管理,用户必须显式提供拷贝构造、赋值运算符重载以及析构函数,否则编译器将 会自动生成一个默认的,如果遇到拷贝对象或者对象之间相互赋值,就会出错,比如:class String{ pulic: String(char* str) { if(str == nullptr) str = ""; _str = new c...原创 2019-10-19 18:10:27 · 991 阅读 · 0 评论 -
C++11部分新特性一、《 范围for、变量类型推导、初始化列表、 委派构造函数、默认函数控制 》
1.初始化列表2.1 C++98中{}的初始化问题在C++98中,标准允许使用花括号{}对数组元素进行统一的列表初始值设定。比如:int array1[] = {1,2,3,4,5}; int array2[5] = {0};对于一些自定义的类型,却无法使用这样的初始化。比如:vector<int> v{1,2,3,4,5};就无法通过编译,导致每次定义vector时...原创 2019-10-19 15:08:27 · 293 阅读 · 0 评论 -
C++ 强制类型转换 reinterpret_cast、static_cast、const_cast、dynamic_cast ----关键字 explicit 的用法
C++ 为什么要有强制类型转换?C语言中很多类型的转换都是1.C语言的类型转换void Test(){ int i = 1; //隐士类型转换 double d = i; printf("%d ,%.2f\n",i,d); int* p = &i; //显示的强制类型转换 int address = (int) p; printf("%x,%d\n"...原创 2019-10-18 18:57:27 · 278 阅读 · 0 评论 -
RAII的扩展学习 简单的守卫锁----防止死锁
RAII思想除了可以用来设计智能指针,还可以用来设计守卫锁,防止异常安全导致的死锁问题。下面就简单实现一个守卫锁:先来看代码:#include<thread>#include<mutex>tempalte<class Mutex >class LockGuard{ public: LockGuard(Mutex& mtx) :_...原创 2019-10-18 16:21:08 · 360 阅读 · 0 评论 -
RAII ------- 智能指针-----------auto_ptr、unique_ptr、shared_ptr 的使用原理、模拟实现、以及缺陷
1.为什么需要智能指针?C++中异常经常会导致资源泄漏的问题,比如在new和delete中抛出了异常,导致内存泄漏,在lock和 unlock之间抛出了异常导致死锁。为了解决这些情况,我们通常使用RII来解决。2.智能指针的使用及原理2.1 RAIIRAII(Resource Acquisition Is Initialization)是一种利用对象生命周期来控制程序资源(如内存、文件句 ...原创 2019-10-18 16:00:25 · 287 阅读 · 0 评论 -
C++ 异常
1.C语言传统处理错误的方式传统的错误处理机制:终止程序**,如assert,**缺陷:用户难以接受。如发生内存错误,除0错误时就会终止程序。返回错误码,缺陷:需要程序员自己去查找对应的错误。如系统的很多库的接口函数都是通过把错误码 放到errno中,表示错误。C 标准库中setjmp和longjmp组合。这个不是很常用,了解一下 。实际中C语言基本都是使用返回错误码的方式处理错误...原创 2019-10-15 19:57:30 · 607 阅读 · 0 评论 -
C++ 继承
1.继承的概念及定义1.1 继承的概念继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特 性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构, 体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。1.2 继承的定义1.2.1 继承的格式下面我们看到B是父类...原创 2019-10-15 16:19:00 · 171 阅读 · 0 评论 -
C++ 入门基础
一、C++关键字和C语言一样,用C++编写程序时也有很多应注意的关键字。了解更多的关键字有利于我们更好的去编写程序。以下是C++98中的关键字目录,C++11中也会有相应的不同,具体这里不加赘述。具体大家可以下去了解了解。一、命名空间在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作 用域中,可能会导致很多冲突。使用命名空间的目的是对标识符...原创 2019-01-15 18:20:36 · 5345 阅读 · 0 评论 -
标准类库中的string 类以及其模拟实现
string类:什么是string类:字符串是表示字符序列的类 。标准的字符串类提供了对此类对象的支持,其接口类似于标准字符容器的接口,但添加了专门用于操作 单字节字符字符串的设计特性。string类是使用char(即作为它的字符类型,使用它的默认char_traits和分配器类型(关于模板的更多信 息,请参阅basic_string)。string类是basic_string模板类的...原创 2019-01-23 15:40:59 · 289 阅读 · 0 评论 -
类与对象 Part Tow
主要部分1. 类的6个默认成员函数2. 构造函数3. 析构函数4. 拷贝构造函数5. 赋值操作符重载6. 默认拷贝构造与赋值运算符重载的问题7. const成员函数8. 取地址及const取地址操作符重载1. 类的6个默认成员函数如果一个类中什么成员都没有,简称为空类。空类中什么都没有吗?并不是的,任何一个类在我们不写的情况下,都会自动生成下面6个默认成员函数。class A...原创 2019-01-17 16:38:53 · 272 阅读 · 0 评论 -
Vector的resize()函数与reserve()
resize()函数与reserve()函数是两个极易引起混淆的函数,下面将详细的区分一下两者的不同:resize()函数:更改容器中的元素数量。如:#include&lt;iostream&gt;#include&lt;vector&gt;using namespace std;int main(){ int len=10; vector&lt;int&gt;v; v.pus...原创 2019-03-02 14:23:16 · 889 阅读 · 0 评论 -
vector的迭代器失效
大家知道vector容器与数组的不同之处在于,vector可以自动扩容它的容量,是一个动态的数组,而我们的普通数组的容量时固定死的。当vector内元素的数量等于vector容量的时候,再向vector中插入数据,vector会自动申请一块儿更大的内存空间,并将原来的数据拷贝过去,并存将新的元素插入。而原来的内存空间将被释放。下面是在VS2017上的例子的运行结果:可见插入数据后,vecto...原创 2019-03-04 12:57:56 · 1048 阅读 · 2 评论 -
N叉树的层序遍历
给定一个 N 叉树,返回其节点值的层序遍历。 (即从左到右,逐层遍历)。返回其层序遍历:[[1],[3,2,4],[5,6]]说明:(1)树的深度不会超过 1000。(2)树的节点总数不会超过 5000。/*// Definition for a Node.class Node {public: int val; vector<Node*>...原创 2019-03-16 15:56:31 · 1069 阅读 · 0 评论 -
STL List的模拟实现
今天要跟大家分享的是我实现的一个关于:List的模拟实现代码,不足之处,希望大家提出建议。#pragma#include<iostream>using namespace std;template<class T>struct _ListNode{ T _data; _ListNode<T>* _prev; _ListNode<T>...原创 2019-03-12 23:40:47 · 109 阅读 · 0 评论 -
C++进阶模板
1.非类型的模板参数模板的参数分为类型参数与类型参数。类型参数:出现在模板参数列表中,跟在class或者typedef后面的参数类型名称。非类型形参:就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用。//定义一个模板类型的静态数组template<class T,size_t N=10>class PRINT{ public: v...原创 2019-04-10 17:07:28 · 263 阅读 · 0 评论 -
C++ 继承关系
1.继承的概念及定义1.1继承的概念继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构, 体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。1.2继承定义1.2.1继承的格式1.2.2继承关系和访问限定...原创 2019-04-26 23:16:56 · 3984 阅读 · 0 评论 -
多态(虚函数表,抽象类,虚表,虚函数的重写,final,override关键字)
1.多态的概念1.1概念多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。(就比如成人与小孩乘车时车票的售价,有成人票,和儿童票。)2.多态的定义及实现多态定义的构成条件:多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。那么在继承中要构成多态还有两个条件:调用函数的对象必须是指针或者引用。被调用的函数必须是虚函数,...原创 2019-04-28 18:55:17 · 536 阅读 · 0 评论 -
容器适配器 -------------- stack 、queue、priority_queue的使用以及 为什么默认使用deque作为底层容器?
什么是适配器?适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结),该种模式是将一个类的接口转换成客户希望的另外一个接口。1.为什么将stack、queue和priority_queue称作为容器适配器?虽然stack、queue、priority_queue中也可以存放元素,但在STL中并没有将其划分在容器的行列,而是将 其称为容器适配器,这...原创 2019-10-11 16:09:38 · 859 阅读 · 1 评论 -
类与对象 part one
入门基础:基本内容:1.类与对象的初步认识2.类的引入3.类的定义4.类的作用域5.类的实例化6.类的访问限定符及封装7.类的对象大小的计算8.类成员函数的this指针1.类与对象的初步认识看下图:类和对象(class)是两种以计算机为载体的计算机语言的合称。对象是对客观事物的抽象,类是对对象的抽象。类是一种抽象的数据类型。它们的关系是,对象是类的实例,类是对象的模板。...原创 2019-01-15 17:24:43 · 302 阅读 · 0 评论