C++知识点
文章平均质量分 84
Gerald Kwok
低到尘埃里,才能开出花来。
展开
-
IO 多路复用
IO 多路复用IO 多路复用实现了代替进程监控大量描述符什么时候就绪,然后进程可以根据就绪的描述符作出相应的操作。IO 过程分为等待和拷贝,等待完毕可以拷贝的时候,这个状态称为就绪。常见的三种 IO 多路复用为 select、poll和 epoll。select原理:(已 C/C++ 中系统调用 select 函数为例)用户将需要监控的文件描述符添加到一个集合中。select 系统调用将集合中的文件描述符拷贝到内核中进行监控,在内核中对所有的描述符进行遍历操作,且只关注是否有描述符就绪。原创 2021-05-28 17:07:46 · 343 阅读 · 1 评论 -
C++ 尽量以const, enum,inline替换 #define
Effective C++总结1. 让自己习惯C++条款01:视C++为一个语言联邦View C++ as a federation of languages该条款主要介绍了C++的可以实现什么。由什么构成的,不太重要。C++高效编程守则视状况而变化,取决于你使用C++的哪一部分。条款02:尽量以const, enum,inline替换 #definePrefer consts, e...原创 2019-04-23 15:30:56 · 264 阅读 · 0 评论 -
绝不在构造和析构过程中调用virtual函数
绝不在构造和析构过程中调用virtual函数Never call virtual function during construction or destruction开始之间先说一个结论来开门见山!!绝对不要在构造和析构中调用virtual函数。这会导致发生不是你期望的事情。比如,我们举个栗子!原创 2019-05-02 19:10:09 · 1685 阅读 · 1 评论 -
C++ 多态的定义及实现
C++ 多态的定义及实现1. 多态定义的构成条件多态是在不同继承关系的类对象,去调同一函数,产生了不同的行为。就是说,有一对继承关系的两个类,这两个类里面都有一个函数且名字、参数、返回值均相同,然后我们通过调用函数来实现不同类对象完成不同的事件。但是构成多态还有两个条件:调用函数的对象必须是指针或者引用。被调用的函数必须是虚函数,且完成了虚函数的重写。说了这么多,怎么实现呢?我们...原创 2019-04-20 11:33:15 · 75457 阅读 · 7 评论 -
shared_ptr循环复用问题
shared_ptr循环复用问题什么是shared_ptr?shared_ptr是一个只能指针,但是它区别于auto_ptrd的管理权转移(进行拷贝构造或赋值操作时,原指针会被释放)和unique_ptr的不可以进行拷贝构造和赋值操作。shared_ptr采用引用计数的方式来管理一个指针,可以让多个shared_ptr对象指向同一个地址,当没有指向的时候才释放,这也算是智能指针里面最好用的一个...原创 2019-05-12 20:49:08 · 697 阅读 · 0 评论 -
二叉搜索树你懂了吗?
二叉搜索树你懂了吗?什么是二叉搜索树?二叉搜索树就是当我们需要对一组非常庞大的数字进行搜索时,什么样的数据结构才能让我们用尽量少的时间来搜索到我们想要找的数字呢?(当然也可以是其他数据类型,这里我用数字来举例)这个时候我们想到了树型结构,可是树型结构也得需要一定的规律插入才能达到我们想要的效果呀。这个时候就诞生了二叉搜索树。二叉搜索树规定,第一个插入的是头结点,后来插入的值如果比当前结点的...原创 2019-05-30 19:28:25 · 220 阅读 · 0 评论 -
虚函数的默认参数的值是依赖对象静态类型决定的
虚函数的默认参数的值是依赖对象静态类型决定的我们来先从一道题来引出这个问题:这道题的要求是输出结果是什么?如果你的选项不是B,那么你需要跟着我一起来学习一下,虚函数的默认参数到底需要取哪个?标准库规定就是说,虚函数的默认参数取的是静态类型的。那么什么是静态类型呢?举个栗子原创 2019-06-04 19:30:56 · 195 阅读 · 0 评论 -
位图及布隆过滤器的模拟实现
位图及布隆过滤器的模拟实现位图位图其实就是一个简化版的哈希表,在很多时候,我们并不关注一个数据出现了多少次,而只是关注这个数据存在与否。所以哈希表太浪费空间了,我们可以用一个比特位来表示一个数据存在与否。那么在 32 位平台下,一个整数是 4 个字节,共 32 个比特位,那么它就可以表示 32 个数据的状态。比如我们要处理 100 个数据并且这 100 个数据都是小于等于 100 的,那么...原创 2019-06-26 16:42:00 · 532 阅读 · 0 评论 -
海量数据面试题
海量数据面试题哈希切割给一个超过100G 大小的 log fifile, log中存着 IP 地址, 设计算法找到出现次数最多的 IP 地址? 与上题条件相同, 如何找到 top K 的 IP ?如何直接用 Linux 系统命令实现?思路:先把这这个 log fifie 分成拆分成很多个小文件。小文件的大小并不是相等的,而是在拆分过程中,根据某个哈希函数把 ip 进行哈希的方式存储在一个...原创 2019-06-27 20:03:08 · 200 阅读 · 0 评论 -
多态的四种表现形式
多态的四种表现形式在之前一提到多态,我下意识就是虚函数重写构成的运行时多态。直到看了一篇文章,才反应过来多态有四种表现形式。cpp-polymorphism运行时多态(虚函数)编译时多态(模板)重载类型转换运行时多态(Subtype Polymorphism/Runtime Polymorphism)运行时多态就是派生类重写基类的虚函数,在调用函数里,参数为基类的指针或引用,会构...原创 2019-07-24 10:56:41 · 15301 阅读 · 0 评论 -
宏(#define)和内联(inline)函数的理解以及区别
宏(#define)和内联(inline)函数的理解以及区别宏宏的缺点:没有类型检查,不安全。宏是在预处理时进行简单文本替换,并不是简单的参数传递,很难处理一些复杂的情况,或者当编译出错时,提醒可读性差。如果宏函数本身很长,会造成代码冗余。宏无法进行调试。当预处理搜索#define定义的符号时,字符串常量并不被搜索。宏的优点:加快了代码的运行效率,不用再去调用浪费时间。让...原创 2019-08-24 14:02:32 · 689 阅读 · 1 评论 -
仔细区别 pointers 和 references
仔细区别 pointers 和 references参考《More Effective C++》没有所谓的 null references一个引用必须总代表某个对象。所以如果有一个变量,其目的是用来指向(代表)另一个对象,但是也有可能他不指向(代表)任何对象,那么你应该使用 pointers,因为你可以将 pointers 设为 null。换句话说,如果一个变量总是代表一个对象,也就是不...原创 2019-08-26 15:09:57 · 284 阅读 · 0 评论 -
返回值优化(Return Value Optimization -- RVO)
返回值优化(Return Value Optimization – RVO)在日常开发中,我们不得不会遇到返回对象的情况。那么对于 追求效率 的程序员来说,返回对象是一件很痛苦的事情。举个栗子????考虑这样的一种情况:分数相乘有这么一个分数类:#include <iostream>class Rational {public: Rational (int n...原创 2019-09-15 20:04:14 · 849 阅读 · 0 评论 -
C++ 多态的实现原理
C++ 多态的实现原理多态的概念:在一个继承体系中,不同对象,执行同一动作,产生不同结果。1.虚函数表1.1 牛刀小试我们以一道题来展开这篇博客要讲的内容。class a{public: virtual void fun() { }protected: int a;};void Test(){ a a; std::cout << size...原创 2019-04-23 10:27:52 · 767 阅读 · 0 评论 -
C++ 异常那些小事儿~
C++ 异常那些小事儿~1. 不要在释放资源或关闭句柄前,抛出异常有的时候我们的程序会在各种各样的地方抛出异常,我们需要做的就是接收异常信息,然后去改进程序就行。但是有一种情况是无论如何都不能抛出异常的。那就是在释放资源之前不能抛出异常。先看一个简单的代码:#include <iostream>#include <string>double Divisio...原创 2019-04-27 11:04:57 · 201 阅读 · 0 评论 -
C++继承
C++ 继承1.什么是继承1.继承的概念:继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。说白了,就是在一个基类的基础上,新定义一个类,这个新的类保...原创 2019-04-18 13:14:32 · 151 阅读 · 0 评论 -
C++ deque的总结
deque1. deque是什么?deque(发音类似“deck”),是双端队列不规则的首字母缩写,双端队列是动态大小的序列式容器,其可以像两端进行伸缩。特定的库可以以不同的方式实现deque,但通常都是一种动态数组。不论在何种情况下,它都允许通过随机访问迭代器直接访问单个元素,可以根据需要动态的伸缩。因此,deque提供了一些与vector相似的功能,但deque在头部和尾部进行数据插...原创 2019-04-09 15:30:32 · 1636 阅读 · 0 评论 -
C++ list容器的迭代器
list容器的迭代器list不同于其他容器,他是一个链表,物理地址并不连续。所以在实现list类的迭代器的时候,需要将迭代器单独封装到一个类里,因为需要重载很多操作符来跟其他容器的迭代器使用达成一致list迭代器:*完成元素访问,具有类似于指针的++,–, , !=, ==这些操作对于链表,结点之间的空间不连续,原生指针++,–不能移动到下一个结点的位置,迭代器不能用原生指针来实现...原创 2019-04-02 20:11:07 · 2676 阅读 · 1 评论 -
C++ vector迭代器失效问题
c++ vector迭代器失效问题在STL中,有很多的容器,对于每个容器的迭代器失效问题都不尽相同。1. 扩容导致迭代器失效问题在使用vector容器的insert接口时,可能会出现因扩容而导致的迭代器失效问题。举个栗子:这个时候,你要插入的只是一个元素,而_finish离 _endOfStorage还很远,那么只要pos <= _finish无论在任何地方插入都不会导致迭代...原创 2019-04-01 17:28:35 · 1919 阅读 · 3 评论 -
C++模拟实现string类
string类1.标准库中的string类1.1 在http://www.cplusplus.com/reference/string/string/ 中是这样解释的:String classStrings are objects that represent sequences of characters.The standard string class provides supp...原创 2019-03-26 15:41:59 · 318 阅读 · 0 评论 -
C++泛类--函数模板、类模板
泛类–函数模板、类模板1. 函数模板1.1 函数模板的概念函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。1.2 函数模板格式template<typename T1, typename T2,…typename Tn>返回值类型 函数名(参数列表){}template <typename T1> // ...原创 2019-03-19 11:30:38 · 1626 阅读 · 0 评论 -
C++内存管理
C++内存管理C/C++的内存分布,并且各个内存区域都存储那些数据栈又叫堆栈,非静态局部变量/函数参数/返回值等等,栈是向下增长的。内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口创建共享内存,做进程间通信。堆用于程序运行时动态内存分配,堆是向上增长的。数据段存储全局数据和静态数据。代码段可执行代码(这里的可执行代码是编译后的01机器码)和只读常量...原创 2019-03-16 16:37:09 · 193 阅读 · 0 评论 -
C++构造函数的初始化链表
构造函数的初始化链表1.构造函数体赋值在我们创建对象的时候,编译器会自动调用构造函数给创建的对象中各个成员变量一个合适的初始值。例如下面的代码:class Date{public: Date(int year, int month, int day) { _year = year; //_year = 1997; _month = month; ...原创 2019-03-16 12:55:48 · 5440 阅读 · 0 评论 -
C++类的6个默认成员函数
类的6个默认成员函数如果一个类中什么成员都没有,简称空类,空类中什么都没有吗?并不是滴~任何一个类都在我们不知情的情况下生成了下面的6个默认成员函数。1.构造函数1.1 构造函数的引入class Date{public: void Display() { std::cout << _year << "-" << _month <<...原创 2019-03-11 17:08:31 · 431 阅读 · 0 评论 -
C++初始类和对象
类和对象C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。根据的我理解:C++中的类就是把C语言中的函数和变量封装到了一起,需要使用的时候,创建一个对象根据需求去使用各个接口(接口就是类中的函数)就行。1.类的引入在C语言中,结构体只能定义变量;可是在C++中结构...原创 2019-03-11 15:18:39 · 212 阅读 · 0 评论 -
C++引用
引用1.引用的概念引用不是新定义的一个变量,而是 给已存在的变量取一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量 共同用一块内存空间。2.使用方法类型& 引用变量名(对象名) = 引用实体#include <iostream>int main(void){ int a = 0; int& ra = a; std::cout <...原创 2019-03-05 15:36:41 · 141 阅读 · 0 评论 -
C++函数重载
函数重载1.函数重载的概念函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 顺序)必须不同, 常用来处理实现功能类似,数据类型不同的问题。#include <iostream>int add(int a, int b){ return a + b;}double add(double...原创 2019-03-05 14:40:52 · 136 阅读 · 0 评论 -
C++命名空间
命名空间1.为什么要出现命名空间 namespace?在C/C++中,变量名、函数名和类名都是大量存在的,这些名称都将作用在全局作用域中,可能会导致很多冲突。使用命名空间的目的就是对标识符的名称进行本地化,以避免明明冲突或名称污染,namespace 关键字的出现就是针对这种问题的。2.命名空间的定义命名空间的定义需要用到关键字 namespace + 命名空间的名字 再加一对...原创 2019-03-05 13:40:57 · 181 阅读 · 0 评论 -
C++ 单例模式
C++ 单例模式1.概念:一个类只能创建一个对象,即单例模式,该模式可以保证系统中该类只有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。简单的说就是,整个程序就需要一份这个类,多了会浪费空间。怎么弄才能更好的处理这种情况。2.单例模式有两种实现模式:饿汉模式饿汉嘛!饿嘛!所以啥也不管先来一份吃的再说。所以饿汉模式,就是在程序启动的时候就创建一个唯一的实例对象。...原创 2019-04-16 21:42:29 · 171 阅读 · 0 评论 -
C++priority_queue
C++ priority_queue1. priority_queue的概念优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。此上下文类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶部的元素)。优先队列被实现为容器适配器,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从特...原创 2019-04-10 14:26:53 · 311 阅读 · 0 评论