C++
文章平均质量分 97
doubleslow;
Success is a series of little wins.
展开
-
奇安信笔试8.16 (第一道题是平台有问题?)
发奖金这个真是平台差,题目本身特别简单,就是很简单的动态规划,很容易看出规律:结果就是2n−12^{n-1}2n−1,n是奖金#include <cmath>int func(int num_money){ if (num_money <= 0) return 0; if (num_money==1 || num_money==2) return num_money; return static_cast<int>(pow(2, num_money-1));}原创 2020-08-18 15:05:40 · 516 阅读 · 0 评论 -
emplace_back()和push_back()的对比,前者不能替代后者的例子
文章目录测试代码:emplace_back()少一次复制操作,所以效率更高emplace_back()无法替代push_back()的例子测试代码:emplace_back()少一次复制操作,所以效率更高这俩代码都是别的网友写的,我看到觉得很棒,搬移故来了这个代码说明参数为左值引用的push_back方法要调用构造函数和复制构造函数,说明确实要先构造一个临时对象,再把临时对象用copy构造拷贝到数组最后面,确实费时。#include <iostream>#include <cst原创 2020-08-13 16:02:42 · 7172 阅读 · 0 评论 -
为什么switch...case比if...else执行效率高
C语言中,条件判断语句是程序的重要组成部分,也是系统业务逻辑的控制手段,书上说switch…case…语句比if…else if…else执行效率要高,但为什么呢?switch…case会生成一个跳转表来指示实际的case分支的地址,而这个跳转表的索引号与switch变量的值是相等的。从而,switch…case不用像if…else那样遍历条件分支直到命中条件,而只需访问对应索引号的表项从而到达定位分支的目的。具体地说,switch…case会生成一份大小(表项数)为最大case常量+1的跳表,程序首先原创 2020-07-15 14:06:50 · 1246 阅读 · 0 评论 -
C++ day43 C++ I/O (二) 深入剖析cout对象
本文主要介绍cout对象的很多方法,这些方法是机器重要的,是cout可以完成输出任务的关键秘诀。文章目录把数值类型转换为字符流(文本格式)重载插入运算符:把值转换为文本格式14个内置数据类型都有重载版本字符指针类型也有重载版本示例:用```void *```打印字符串的地址拼接输出:非常好的设计特性!因为返回值类型都是```ostream &```put():用于显示字符;现为模板函数;也可以拼接输出write():用于显示整个字符串示例给write()传入数值,它会逐字节解释为ascii码(神奇原创 2020-07-31 23:05:17 · 274 阅读 · 0 评论 -
C++ day43 C++ I/O(一) 流,缓冲区,iostream类库
文章目录引入历史引入每一个程序都要用输出输入,所以必须好好学。C++的I/O用了很多高级的语言特性,包括类,派生类,多重继承,函数重载,虚函数,模板等。所以把I/O放在全书最后一章,前面用到的都是些皮毛。要像真正理解C++ I/O的设计,需要掌握很多内容。所以不要觉得输入输出自己已经很熟悉了,毕竟一本书的所有示例代码都敲了一遍,每个示例都有输入输出。就以为自己很懂输入输出了。之前用的cin是istream类的对象;cout是ostream类的对象;还用过ifstream类和ofstrea原创 2020-07-31 21:58:48 · 496 阅读 · 0 评论 -
C++ day42 C++的其他类库(除STL外)
STL已经提供了一个非常好的可重用代码源,STL工具可以被用来解决很多编程问题了,但是C++还是觉得不够,在STL之外,也提供了一些模板类,这些模板类基本都是用来做一件很专业的事情的,比如头文件complex中提供了类模板complex,提供了标准的复数运算和一些处理复数的函数。C++11新增的头文件random提供了很多处理随机数的函数。文章目录C++的三个数组模板:vector, valarray, arrayvector模板类valarray类模板:数值计算绝对的王者示例:vector VS原创 2020-07-31 21:59:02 · 458 阅读 · 0 评论 -
C++ day41 STL算法库(处理容器的非成员函数)
文章目录前面零碎介绍到的STL非成员方法的通用设计:用模板提供泛型,用迭代器提供容器中数据的通用表示STL算法库分类根据完成的操作来分类(官方分类法)根据结果放置的位置分类:就地算法 VS 复制算法```_if```后缀版本的函数string类和STL的暧昧关系示例:给string类用STL方法:一个单词的所有排列组合,next_permutation函数暴力穷举STL非成员函数 VS 容器成员方法:成员方法胜!示例:remove()的成员版和非成员版STL使用大示例(展示STL组间的协作):把输入的多个原创 2020-07-31 23:07:59 · 1241 阅读 · 0 评论 -
C++ day 39 函数对象(也叫函数符)
文章目录原创 2020-07-31 23:08:05 · 218 阅读 · 0 评论 -
C++ day 38 STL容器(15种!)
文章目录容器:存储其他对象的对象复制构造,复制赋值 VS 移动构造, 移动赋值序列容器:对基本容器概念的重要改进(7种STL容器实际上都是序列容器)在基本容器的要求的基础上增加的要求7种序列容器类型vector:数组的一种类表示,有自动内存管理功能deque:双端队列list:双向链表,可以双向遍历示例forward_list:单链表queue:一个适配器类,它的默认底层类是dequepriority_queue:优先队列,也是适配器类,但默认底层类是vectorstack:适配器类,底层类为vecto原创 2020-07-31 23:05:32 · 287 阅读 · 0 评论 -
C++ day 38泛型编程:STL的底层理念(迭代器的5个大类,6个预定义迭代器)
文章目录OOP VS GP迭代器为什么需要:用一个例子引入需求先给数组定义find()函数再给链表定义find()函数什么是迭代器,有哪些特征从常规指针到迭代器的雏雏雏形改函数参数,得到迭代器雏形对链表容器,要专门定义迭代器类小结迭代器的类型(5种)输入迭代器(单通行,只读)输出迭代器(单通行,只写)正向迭代器(多次通行,既可以读写,又可以只读)双向迭代器随机访问迭代器OOP VS GP关注点不同。泛型编程关注算法,旨在编写独立于数据类型的代码,即任何类型都用一套代码,C++实现泛型编程的工具原创 2020-07-31 23:05:41 · 443 阅读 · 0 评论 -
C++ day37 标准模板库STL初识
文章目录简介是什么:容器,迭代器,函数对象,算法的模板STL不是面向对象编程,而是泛型编程!历史:1994年发布模板类vector示例1:创建vector对象,用[]随机访问元素vector类的方法示例2:演示这些方法STL的非成员函数:也是为了通用性for_each()random_shuffle():随机排列sort()示例基于范围的for循环:专为STL设计示例1:简单,```for (double x : prices)```示例2:替换for_each和for_each的区别:基于范围的for循环原创 2020-07-31 23:05:48 · 187 阅读 · 0 评论 -
C++ day36 智能指针模板类:让管理动态内存分配更容易
文章目录智能指针:类似指针的类对象从对象指针和常规指针的对比引入智能指针哪些行为类似于常规指针怎么用首先包含头文件memory再实例化所需类型的指针注意:不可以把常规指针隐式转换为智能指针,只可以显式转换简单示例1简单示例2注意:一定不要给智能指针模板类的构造函数传递非堆内存地址!!!delete作用于栈内存有什么后果:它会无所作为,不释放栈内存,没啥可怕后果auto_ptr比unique_ptr,shared_ptr差在哪里示例:auto_ptr和unique_ptr的所有权模型会造成的问题,前者运行时崩原创 2020-07-31 23:06:08 · 151 阅读 · 0 评论 -
C++ 按引用传递参数的好处
pass by reference对于数组和结构这种大的数据,按值传递(pass by value)需要创建副本,占内存费时间,使用引用就只传地址,和按指针传递一样,但是使用起来又比指针简单安全,就是在使用原数据。对于unique_ptr智能指针模板类,它只允许源指针是临时右值时候的赋值,所以如果实参不是临时右值,按值传递就会成为非法赋值,编译器报错。示例:#include <iostream>#include <string>#include <memory&g原创 2020-06-15 20:59:15 · 2291 阅读 · 0 评论 -
C++ day35 string类
文章目录string类string类的真面目:模板类```basic_string```的类型参数为```char```的具体化string类的9个构造函数:创建string类对象示例:7个旧的构造函数,重载=,重载+=,重载<<,重载[]C++11新增的两个构造函数string类的输入方式回顾C风格字符串的3种输入方式(cin,get, getline)string对象的2种输入方式(cin, getline)C字符串和string对象在cin和getline()中的区别示例:可以看到stri原创 2020-07-31 23:06:15 · 235 阅读 · 0 评论 -
C++ day34类型转换运算符dynamic_cast,const_cast,static_cast,reinterpret_cast
文章目录dynamic_castconst_caststatic_castreinterpret_castdynamic_castconst_caststatic_castreinterpret_cast原创 2020-07-18 15:49:12 · 273 阅读 · 0 评论 -
C++ day34 RTTI,dynamic_cast,typeid,type_info
文章目录RTTI(C++新增特性):只可用于有虚函数的类!为什么要在运行阶段知道类型?RTTI只可以用于包含虚函数的类层次结构如何实现dynamic_cast运算符(最常用的RTTI组件):生成一个指向派生类的指针示例:dynamic_cast的使用把dynamic_cast运算符和引用结合使用(一般是和指针一起用)typeid运算符和type_info类示例应先考虑使用dynamic_cast和虚函数,然后才考虑typeidRTTI(C++新增特性):只可用于有虚函数的类!runtime type i原创 2020-07-31 23:07:22 · 159 阅读 · 0 评论 -
C++ day34 异常(三)异常规范,未捕获异常,意外异常,异常导致内存泄漏
文章目录异常规范(C++98添加,C++11已摒弃,不建议使用)异常规范的作用(正是这俩作用的鸡肋和难办使它失去了粉丝)C++11支持的特殊的异常规范:关键字noexcept(程序员的庄严承诺)异常被引发后可能出现的两种问题未捕获异常 uncaught exception示例意外异常 unexpected exception(C++11摈弃异常规范的另一理由)异常处理可能导致==内存泄漏==:解决办法是智能指针模板总结异常规范(C++98添加,C++11已摒弃,不建议使用)exception speci原创 2020-07-31 23:07:16 · 1175 阅读 · 1 评论 -
C++ day33 异常(二)exception类
文章目录catch块的顺序完全不知道会引发什么异常知道一部分可能引发的异常如果catch参数是类的对象,不是类的引用,会怎样?exception类stdexcept头文件```logic_error```类:描述典型的逻辑错误,这类错误可以通过编程修复```runtime_error```类:这类异常是无法避免的问题bad_alloc异常类:也从exception类公有派生而来,处理new分配内存失败的错误示例和空指针方案兼容的方法(不太好使?)异常和继承的密切邂逅:在类中嵌套异常类声明示例catch块的原创 2020-07-31 23:10:11 · 868 阅读 · 0 评论 -
思路清奇的优秀代码收藏集
文章目录for循环for循环#include <stdio.h>int main(){ int num; for(printf("Keep entering numbers!\n");num!=10;) scanf("%d", &num); printf("That's the number I want!\n"); return 0;}Keep entering numbers!1269410That's th原创 2020-06-10 11:05:52 · 175 阅读 · 0 评论 -
C++ day32 异常(一)try-throw-catch联动机制
文章目录异常(新增)异常类异常(新增)异常提供了处理特殊情况的机制,如果不处理这些特殊情况,程序会终止。异常类原创 2020-07-31 23:06:38 · 233 阅读 · 0 评论 -
C++ day31 友元(二)嵌套类
文章目录嵌套类(新增):==在其它类中声明==的类为什么要设计嵌套类,有什么用?(成全其包含类)从类中定义结构体引入作用域和访问控制嵌套类的作用域是包含它的类访问控制规则示例:用模板类实现队列总结嵌套类(新增):在其它类中声明的类nested class在一个类的内部定义另一个类,前者叫做包含类,后者叫做嵌套类。以前C++不支持嵌套类,是新增的(不确定是不是C++11增的。)。包含和嵌套类可不同哈。包含是说:把一个类的对象作为另一个类的成员。而嵌套类不是说什么对象,而是创建了一个新的类!只不过这个原创 2020-07-31 23:07:09 · 422 阅读 · 0 评论 -
++i比i++快的原因
原文一直都知道这个事实,C++ primer上看到的,知道是底层代码实现造成的,但是不清楚代码长什么样,今天偶遇了原创 2020-06-07 18:14:45 · 1104 阅读 · 1 评论 -
C++ day30 友元(一)友元类, 友元成员函数
文章目录在其它类中声明的类友元类友元类方法(友元成员函数)嵌套类(新增)异常异常类(新增)运行阶段识别(RTTI):一种确定对象类型的机制(新增)改进后的类型转换控制:提高了类型转换的安全性在其它类中声明的类友元类友元类方法(友元成员函数)嵌套类(新增)异常异常提供了处理特殊情况的机制,如果不处理这些特殊情况,程序会终止。异常类(新增)运行阶段识别(RTTI):一种确定对象类型的机...原创 2020-07-31 23:06:30 · 610 阅读 · 0 评论 -
codeblocks调试时查看vector动态数组的值
codeblocks调试时查看不了vector动态数组的值,只能看到使用的内存地址,如图参考了这篇博文的做法,成功解决。挺简单的,花不了几分钟。重启电脑后,调试还是显示上面那样,没成功,但是博文的作者给的建议很管用:关键操作:去掉"禁用启动脚本"的红勾,就成功了!!不明白为啥但可以用就行了...原创 2020-04-18 21:42:41 · 1704 阅读 · 0 评论 -
C++ 代码重用(六)总结
三个继承私有继承和保护继承只继承实现,不继承接口(因为基类的公有接口,即公有方法,会变成内部接口(私有方法或者保护方法):在私有继承中到派生类就成了私有方法,在保护继承中到派生类就成了保护方法)。所以派生类对象不能显式使用基类的接口。这时候派生类对象不可以被看做是一种基类对象。所以,不显示强者转换的话,基类指针或引用不可以指向派生类对象。而公有继承继承了基类的接口。派生类对象可以显式使用基类的...原创 2020-07-31 23:13:41 · 102 阅读 · 0 评论 -
C++ day29 代码重用(五)类模板(篇三:成员模板, 把模板用作参数)
模板果然内容丰富功能强大用法灵活,用法真tm多,很期待阅读STL源码的那一天,打好基础,希望不要太陌生。写本文的过程中,感觉离STL越来越近了,本文模板的特性都是主要用于实现STL的。文章目录成员模板(把模板用作类或结构的成员,对于STL的完全实现特别重要)示例这个示例还是挺晕乎的,用了三个泛型名,在一个模板类中把另一个模板类作为成员(感觉很神奇吧,毕竟模板类并不是实际的可以生成对象的类,只是通...原创 2020-07-31 23:13:18 · 121 阅读 · 0 评论 -
C++ day28 代码重用(四)类模板(篇二:数组模板类,非类型参数,具体化)
模板类常用于实现容器类,因为类型参数的概念非常适合于把相同的存储方案用于不同的类型。并且C++最初引入模板其实主要的目的之一就是重用容器类的代码。文章目录数组模板一,构造函数方法:使用动态数组和构造函数提供元素数目(使用堆内存,更通用)二,表达式参数方法:用模板参数提供常规数组的大小(使用自动内存,速度更快)非类型参数(表达式参数)把常规类的技术用于模板类(体现了模板的多功能性,高级的同时有点眩...原创 2020-07-31 23:13:25 · 225 阅读 · 0 评论 -
C++ day27 代码重用(三)类模板(篇一:泛型编程,容器类)
ds原创 2020-07-31 23:17:13 · 148 阅读 · 0 评论 -
C++ day26 代码重用(二) 多重继承(MI, multiple inheritance,主要研究多重公有继承)
保护继承(私有继承的变体)基类的公有成员和保护成员都成为派生类的保护成员。保护继承 VS 私有继承相同:基类(第一代类)的接口在派生类(第二代类)都可用。不同:当从派生类再派生一个类时:私有继承中,第三代类不可以用基类(第一代类)的接口,因为基类的公有方法在派生类(第二代类)已经成为了私有方法。保护继承中,第三代类还可以使用第一代类的接口。因为第一代类的公有方法(接...原创 2020-07-31 23:13:10 · 308 阅读 · 0 评论 -
C++的关键字重载
vrtual: 虚基类中的"虚"和虚函数的“虚”不是一回事,没有关系,这实际上是一种关键字重载。由于C++用户墙裂反对再引入新的关键字(已经够多了),所以就用了virtual。static:...原创 2020-04-10 17:32:02 · 573 阅读 · 0 评论 -
C++ day25 代码重用(一) 包含,私有继承,保护继承
C++的各种先进理念中包含了一条:代码重用。上一章学习的公有继承是实现代码重用理念的方式之一,但是还有多种机制可以实现这个理念:私有继承保护继承包含/组合/层次化(containment/composition/layering):把一个类的对象作为另一个类的成员多重继承multiple inheritance,MI:可以是多重私有继承,也可以是多重公有继承(容易出问题)类模板前面三...原创 2020-07-31 23:13:05 · 210 阅读 · 0 评论 -
C++ day25 继承(五)继承和动态内存分配
文章目录当继承和动态内存分配搅和在一起,会有什么火花当基类没用new和delete(动态内存分配)当基类用了new和delete(动态内存分配)派生类不用动态内存分配派生类是否需要显示定义析构函数: no派生类是否需要显示定义复制构造函数: no派生类是否需要显示定义赋值运算符函数: no派生类也用动态内存分配派生类是否需要显示定义析构函数: yes派生类是否需要显示定义复制构造函数: yes派生...原创 2020-07-31 23:16:59 · 196 阅读 · 0 评论 -
C++ day24 继承(四)抽象基类,纯虚函数,protected
文章目录关键字protected(带来方便同时带来危险,最好不用)抽象类和纯虚函数(is-a关系用公有继承实现有时候也不太合适)用圆和椭圆的笨拙派生为例,挑拨is-a和公有继承的搭档关系替代笨拙继承的办法1:单独定义Circle类(不做父子,自立门户)替代笨拙继承的办法2:ABC, 抽象类(做不了父子就做兄弟)关键字protected(带来方便同时带来危险,最好不用)关于访问控制,即访问类的私...原创 2020-07-31 23:12:58 · 720 阅读 · 0 评论 -
C++ day23 继承(三) 静态联编, 动态联编,虚函数
文章目录联编静态联编static binding or 早期联编early binding动态联编dynamic binding or 晚期联编late binding用对象的指针和引用去调用方法(虚成员方法)先复习C++对类型一致性的严格要求(类型转换)向上强制转换upcasting 和 向下强制转换downcasting示例 用指针或引用调用虚成员方法派生类对像都是基类对象is-a公有继承关系...原创 2020-06-26 15:58:09 · 265 阅读 · 0 评论 -
C++ day22 继承(二)基类指针数组通过虚方法实现智能的多态
继承一共有三种:公有继承私有继承保护继承文章目录公有继承基类和派生类的关系is-a(用公有继承表示“是一种”的关系)has-auses-ais-like-ais-implemented-as-a多态公有继承公有继承继承中,基类和派生类的关系is-a(用公有继承表示“是一种”的关系)是一种(比如香蕉是一种水果,是水果大类的一个特例,所以水果的所有属性和方法都适用于香蕉,所以很适...原创 2020-07-31 23:16:44 · 480 阅读 · 0 评论 -
C++ day22 继承(一)代码重用, 公有派生,基类指针和引用指向派生类
本章内容是继承,主要用于实现C++的思想之一:代码重用。文章目录代码重用C通过 函数库C++通过 类库 和 类继承类库继承示例1基类(普通玩家类)类声明和类定义主程序派生类(参赛玩家类)公有派生派生类会继承基类的所有接口和实现派生类继承了一大笔财产之后,还需要自己做点事情初始化成员列表(只可以用于构造函数)类声明和类定义主程序当基类和派生类遇上指针和引用参数是基类引用的函数可用于派生类可以把基类...原创 2020-07-31 21:58:30 · 231 阅读 · 0 评论 -
C++ day21 用动态内存开发类 (四)写一个队列类,模拟真实队列(成员初始化列表)
指向对象的指针类声明头问价和类定义方法文件在这里,链接文章使用下标找最短字符串和字符最前字符串,但本文使用指向对象的指针实现,只需对原来主程序做一丢丢改动,很简单。//main.cpp#include <iostream>#include "StringBad.h"void eatline();typedef unsigned int uint;const uint AR...原创 2020-07-31 23:15:03 · 311 阅读 · 0 评论 -
C++ day20 用动态内存开发类 (三)函数返回对象,指向对象的指针
文章目录返回对象1 按引用传递,效率高(首选;当返回调用对象 或 返回作为参数传入的对象)1.1 返回指向const对象的const引用1.2 返回指向非const对象的非const引用例子1:重载赋值运算符例子2:重载<<运算符2 按值传递,效率低,可有时候是唯一选择(次选,没法传引用才选)2.1 返回const对象(防止a + b = c;这种赋值语句通过编译,尽量选这个)2.2 ...原创 2020-07-31 23:14:55 · 436 阅读 · 0 评论 -
C++ day20 用动态内存开发类 (二)为字符串对象重载一系列运算符
本文将对上一篇文章的StringBad类进一步添砖加瓦,主要是添加更多的类方法,使得这个类具有更多的功能,主要涉及到返回字符串长度方法,比较两个字符串的大小(字符编码大小)的方法,重载抽取运算符以从输入字节流获取输入,静态类方法,重载数组下标运算符以返回某一个字符。相比于C++提供的标准string类,这些还差得很远,但是相比于上文StringBad类的错误百出,起码这个类是正确的,且有更多功能...原创 2020-07-31 23:16:28 · 127 阅读 · 0 评论 -
C++ day20 用动态内存开发类 (一)自己写一个string类,浅复制遇到指针成员会出事(复制构造函数,赋值运算符函数,类的静态成员)
文章目录在构造函数中使用new,在运行时分配内存不再可有可无的析构函数有时候必须重载赋值运算符在构造函数中使用new,在运行时分配内存前面以字符串数组的长度为例说过很多次,数组的长度很棘手,最好的也是通常的办法就是动态分配内存,在运行时根据需要分配适当的大小。当然了,C++已经提供了string类,字符串的问题已经解决了,但是我们简单地使用string类,就会因为OOP的封装和隐藏特性,我们接...原创 2020-06-26 16:02:56 · 168 阅读 · 0 评论