c++
文章平均质量分 57
zhc_24
这个作者很懒,什么都没留下…
展开
-
互斥锁和条件变量的封装类
/*两个简单的实现类: MutexLock,MutexLockGuard,Condition类MutexLock是封装了互斥量的封装类MutexLockGuard是管理MutexLock资源的警卫类Condition是条件变量的封装类 */class MutexLock : boost::noncopyable {public: MutexLock() : holder_(0)...原创 2018-12-17 12:56:45 · 253 阅读 · 0 评论 -
右值引用
写在前面 c++ 11 新特性之一:右值引用概念。主要内容 左值和右值概念:在c++11 之前 是没有办法直接得到右值的引用只能使用常量引用获取右值。 比如const int &a = 1; 在这种情况下,右值不能被修改的。 那什么是左值什么是右值?C++( 包括 C) 中所有的表达式和变量,要么是左值,要么是右值。通俗的左值的定义就是非临时对象,那...原创 2018-08-26 23:47:48 · 495 阅读 · 0 评论 -
可变参数模板
写在前面 C++11的新特性–可变模版参数(variadic templates)是C++11新增的最强大的特性之一,它对参数进行了高度泛化,它能表示0到任意个数、任意类型的参数。相比C++98/03,类模版和函数模版中只能含固定数量的模版参数,可变模版参数无疑是一个巨大的改进。然而由于可变模版参数比较抽象,使用起来需要一定的技巧,所以它也是C++11中最难理解和掌握的特性之一。虽然掌握可...原创 2018-08-26 23:08:46 · 1008 阅读 · 0 评论 -
tuple 类型
写在前面 STL当中的tuple类型主要内容 起因用过python等动态语言的人都应该知道,这类的语言函数都可以返回多个值,每个值可以是不同的类型的对象。同样Java和python当中都有可以装载不同类型的变长数组存在,Java当中是容器Array,python当中是列表list。 在c++当中没有提供一个方便的数据结构可以像这样实现不同类型的对象的打包。唯一能够...原创 2018-08-26 21:24:43 · 2041 阅读 · 0 评论 -
list
写在前面 STL源码剖析:list主要内容 list也就是链表结构。list本身和list节点是不同的结构。list节点template <class T>struct __list_node { typedef void* void_pointer; void_pointer next; void_pointer prev; T da...原创 2018-08-04 14:01:07 · 118 阅读 · 0 评论 -
deque
写在前面 STL:deque总结主要内容 为什么需要deque? deque的作用是什么?问题1:vector虽然可以动态的增容,但是只能在vector的尾部进行插入和删除的效率比较高,在vector的头部操作带来的开销太大,无法被接受,(伴随大量的元素移动)所以vector就是一个单端开口的数组。 问题2:当vector容量满的时候需要扩容,这时候需要开辟一块...原创 2018-08-09 23:40:12 · 739 阅读 · 0 评论 -
c++ 类的初始化列表总结
写在前面 c++类的初始化列表总结参考C++类构造函数初始化列表几个要点 类的初始化列表的作用: 显示的初始化类的成员变量。如果不使用初始化列表显示的初始化成员变量,成员变量也是会被初始化的。使用初始化列表: 对于基本数据类型以及指针类型,使用初始化列表显示初始化和在构造函数体内赋值达到的效果以及效率基本是一样的。 对于非基本数据类型,比如自定义的...原创 2018-08-09 22:50:58 · 477 阅读 · 0 评论 -
迭代器---STL源码剖析
写在前面关于STL源码剖析当中对于迭代器这一章内容的一些重点技巧的理解。 STL设计的一些启发性思维是值得学习的。重在总结,以备后用。迭代器 迭代器是一种智能指针。最重要的工作就是对opperator* 和 operator->的重载。对于operator->的重载需要注意:p->size()会被编译器自动绑定其成员,会被翻译成:p->operzto...原创 2018-07-31 12:59:59 · 269 阅读 · 0 评论 -
c++:value initialization 值初始化
写在前面:今天看到一种写法: int a = int(); 一瞬间在思索对于内置类型而言他们是非类类型,但是却可以像类一样有构造函数么?如果你曾页有这样的疑惑,往下看。参考value initialization c++为非类类型的原生类型 提供的缺省构造函数。template <typename T> struct Foo { ...原创 2018-07-27 13:56:37 · 1558 阅读 · 0 评论 -
vector
写在前面: STL顺序容器vector。主要内容 vector 是动态数组 是对于c++内建的数组array的升级版本。array是静态空间,vector是动态空间。vector的迭代器就是普通指针,支持随机存取。也就是Random Access Iterator。template <class T, class Alloc = alloc>cla...原创 2018-08-03 21:53:04 · 210 阅读 · 0 评论 -
c++ new delete 详解
详解c语言中使用malloc/calloc/realloc/free进行动态内存分配,malloc/calloc/realloc用来在堆上分配空间,free将申请的空间释放掉。 这里要注意的一点是,为什么分配了空间之后,必须要用户手动去free掉呢,是因为malloc、calloc、realloc都是在堆上分配的,堆上分配的空间必须由用户自己来管理,如果不释放,就会造成内存泄漏。而...原创 2018-07-24 13:29:12 · 283 阅读 · 0 评论 -
c++11新特性右值引用理解
右值引用 (Rvalue Referene) 是 C++ 新标准 (C++11, 11 代表 2011 年 ) 中引入的新特性 , 它实现了转移语义 (Move Sementics) 和精确传递 (Perfect Forwarding)。它的主要目的有两个方面: 消除两个对象交互时不必要的对象拷贝,节省运算存储资源,提高效率。==能够更简洁明确地定义泛型函数。== 左值,右值的定义...原创 2018-07-24 13:28:18 · 1204 阅读 · 0 评论 -
c++当中为什需要引用
为什么需要引入引用?当初加入“引用”这个语言特性的契机是运算符重载。为了让运算符重载的语法能够更加接近内建的运算符,需要能够让一个函数返回一个左值,通俗的讲就是要能够对一个函数的返回值赋值。到了今天,引用除了原始用途之外,实际中最主要的用途是以==常量引用==来修饰函数的输入参数==输入参数,在函数内部不会被改变,此时用常量引用就是最合适的== 其他说法代替指针:引用比...原创 2018-07-24 13:27:38 · 2010 阅读 · 0 评论 -
string,c_string,字符数组总结
选用C++标准程序库中的string类,是因为他和c-string比较起来,不必担心内存是否足够、字符串长度等等,而且作为一个类出现,他集成的操作函数足以完成我们大多数情况下(甚至是100%)的需要。我们可以用 = 进行赋值操作,== 进行比较,+ 做串联。string是STL提供的一种自定义类型,它处理空间占用问题是自动的,需要多少,用多少,不像字符指针那样,提心吊胆于指针脱钩时的空间游离,...原创 2018-05-30 13:23:46 · 2421 阅读 · 1 评论 -
c++ 嵌套类 局部类
写在前面 嵌套类 函数的嵌套定义是否可以主要内容 什么是嵌套类在一个类中定义的类被称为嵌套类,定义嵌套类的类被称为外部类。 为什么使用嵌套类对类进行嵌套通常是为了帮助实现另一个类,并避免名称冲突。 往往是因为外围类需要使用嵌套类对象作为底层实现,并且该嵌套类只用于外围类的实现,且同时可以对用户隐藏该底层实现。class A{public:...原创 2018-08-23 20:21:23 · 272 阅读 · 0 评论 -
c++和闭包
写在前面 之前理解了python当中的闭包的概念和使用,虽然对比而言c++不支持函数的嵌套定义但是c++可否也实现闭包的功能呢?主要内容闭包有很多种定义,一种说法是,闭包是带有上下文的函数。说白了,就是有状态的函数。更直接一些,不就是个类吗?换了个名字而已。 一个函数, 带上了一个状态, 就变成了闭包了. 什么叫 “带上状态” 呢? 意思是这个闭包有属于自己的变量, 这些个变量...原创 2018-08-23 23:03:15 · 846 阅读 · 0 评论 -
c++ cin,cout 加速
加上以下两行 ios::sync_with_stdio(0); cin.tie(0);原创 2018-09-24 18:54:35 · 1727 阅读 · 0 评论 -
c++ 拷贝控制
写在前面 c++的拷贝控制主要内容 合成析构函数 每当一个类未定义析构函数的时候,编译器会合成一个析构函数。 合成析构函数为空。 析构函数分为两个部分:函数体和析构部分。 函数体为空,在析构函数体执行完毕之后,成员会被自动销毁。成员是在析构函数体之外的隐含的析构阶段被析构的。 需要析构函数的类也需要拷贝和赋值操作因为一个类需要自定义析构...原创 2018-08-30 10:24:11 · 160 阅读 · 0 评论 -
c++11:final关键字
笔记c++引进这样一个关键字:final通常我们不希望一个类被继承,或者不想考虑他是否合适被继承就可以在类名之后加上final关键字。原创 2018-09-04 21:03:15 · 1895 阅读 · 0 评论 -
虚表指针
写在前面 虚表指针 多继承下的虚表指针情况 override c++11主要内容 为什么虚表当中虚函数按照其声明顺序放于表中?同一个虚函数入口地址在父类虚表和子类虚表中的偏移量必须保持一致。 当多重继承的时候,子类必须把来自不同父类的虚函数,放入不同的虚表中,不然无法保持这些虚函数的偏移量和它们的父类一样。 1)虚函数按照其声明顺序放于表中。 2)父类...原创 2018-09-04 20:55:16 · 1328 阅读 · 0 评论 -
c++11新特性:default,delete
写在前面 c++11的新特性: default和delete主要内容 default可以对具有合成版本的成员函数使用=default显示的要求编译器生成合成的版本,当在类内修饰从成员的声明的时候,合成函数将隐式的声明为内联函数。如果不需要合成的是内联的只需要在类定义的外部使用default进行声明。 阻止拷贝 delete虽然 大多数类都应该定义(显示的或...原创 2018-08-29 15:41:26 · 287 阅读 · 0 评论 -
c++ 直接初始化和拷贝初始化
写在前面 c++的初始化主要内容 拷贝初始化使用 = 进行的初始化时拷贝形式的初始化,编译器将等号右边的初始值拷贝到新创建的对象上去。这时将调用对象定义的各种构造函数进行操作,只要这些构造函数满足这样的调用就会被隐式的调用,但是被explicit修饰的构造函数将会禁止该构造函数进行这样隐式的调用。 直接初始化不使用=进行初始化的操作就是直接初始化采用()直...原创 2018-08-29 11:09:30 · 531 阅读 · 0 评论 -
STL 配接器
写在前面 STL配接器主要内容 配接器是什么?配接器这个概念其实是一种设计模式。将一个类的接口转换为另一个类的接口,使原本接口不相兼容的类可以一起运作。 配接器的分类函数配接器容器配接器迭代器配接器 容器配接器STL提供两种容器配接器:stack和queue。他们都是修饰deque接口而构成另一种风格的容器面貌。 迭代器配接器...原创 2018-08-22 00:21:50 · 607 阅读 · 0 评论 -
STL:仿函数
写在前面 STL当中的仿函数主要内容 函数对象和仿函数仿函数是早期的命名,采用的新的名称是函数对象。 函数对象就是一种具有函数特质的对象。 这种东西在调用者可以像函数一样被调用,在被调用者则以对象所定义的()操作符扮演函数的实质角色。 仿函数的作用第一个版本表现在最常用的某种运算 第二个版本表现在最泛化的演算流程,允许用户已模板参数来指定所要采取的策...原创 2018-08-21 19:33:07 · 262 阅读 · 0 评论 -
动态链接库和静态链接库
写在前面 动态链接库和静态链接库的对比总结主要内容 1 静态链接库的优点 (1) 代码装载速度快,执行速度略比动态链接库快;动态连接库需要寻址操作才能确定其中调用的函数,而静态链接库中的函数在编译时就确定了调用 的函数,因此,在效率上,动态库比较慢 (2) 只需保证在开发者的计算机中有正确的.LIB文件,在以二进制形式发布程序时不需考虑在用户的计算机上.LIB文件是...原创 2018-08-31 17:38:45 · 227 阅读 · 0 评论 -
字节对齐总结
写在前面 字节对其是面试笔试当中出现频率算是比较高的一个知识点。 在此总结一下。主要内容 例题:#pragma pack(2)class BU{ int number; union UBffer { char buffer[13]; int number; }ubuf; void fo...原创 2018-08-31 17:20:50 · 310 阅读 · 0 评论 -
nuion
写在前面 c++union类型 union的特殊点 union的用法 union在c++11之后的新的特点主要内容 union 是什么union是一种节省空间的类。是类和class一样定义出来的是一个类型。语法和class或者是struct差不多但是用法不同。 一个union可以有多个数据成员但是任意时刻只有一个数据成员可以使用,当给某个数据成员...原创 2018-08-31 16:50:42 · 321 阅读 · 0 评论 -
inline关键字
写在前面 c++ inline关键字主要内容Tip: 只有当函数只有 10 行甚至更少时才将其定义为内联函数.定义: 当函数被声明为内联函数之后, 编译器会将其内联展开, 而不是按通常的函数调用机制进行调用. 优点: 当函数体比较小的时候, 内联该函数可以令目标代码更加高效. 对于存取函数以及其它函数体比较短, 性能关键的函数, 鼓励使用内联.结论: 一个较为合理的...原创 2018-08-28 20:17:31 · 201 阅读 · 0 评论 -
STL:heap
写在前面 STL:heap主要内容 heap是什么heap并不是STL的容器,是以算法的方式出现的。扮演priority_queue的幕后英雄。 priority_queue采用的底层机制就是heap。这里需要注意heap并不是一种二叉搜索树,更不是平衡的二叉搜索树比如AVL树和红黑树。 heap其实是一种完全二叉树。 完全二叉树:除了最低风层的叶子结...原创 2018-08-21 11:43:27 · 313 阅读 · 0 评论 -
C++ STL unordered_map和map的使用和性能分析
unordered_map是C++ Boost库中的内容,这里的unordered翻译成“无序”。但它并不是完全的“无序”的概念,而是散列式的存储方式。unordered库提供了两个散列映射类,unordered_map和unordered_multimap。它们用散列表代替了二叉树的实现,模板参数多了散列计算函数,比较谓词使用equal_to<>。 看到这里,我们就应该明白,...原创 2018-05-10 19:22:21 · 17528 阅读 · 0 评论 -
[编程题] 牛牛找工作
#include <iostream>#include <vector>#include <algorithm>using namespace std;struct work{ int hard; int pay; work(int a, int b) :hard(a), pay(b){}};int main() { ...原创 2018-05-10 18:46:49 · 576 阅读 · 0 评论 -
注意点01-对于指针的参数传递
#include <iostream>void GetMemeory(char *p){ p = (char *)malloc(100);}void Test(){ char *str = NULL; GetMemeory(str); strcpy(str, "Thunder"); strcat(str + 2, "Downloader");原创 2018-01-02 21:45:26 · 135 阅读 · 0 评论 -
STL算法库总结
写在前面:STL算法库是经常需要用到的,对于一些给定的算法使用起来比自己写要方便,当然对于每一种算法的原理是要清楚的,当然更要熟练使用了。 下面就对STL算法库中的算法做一个总结。算法库提供大量用途的函数(例如查找、排序、计数、操作),它们在元素范围上操作。注意范围定义为 [first, last) ,其中 last 指代要查询或修改的最后元素的后一个元素。 定义于头文件 第一原创 2018-01-11 12:56:16 · 1502 阅读 · 0 评论 -
new delete mallco free 的深刻理解
new delete mallco free 的深刻理解首先理解 c语言的mallco和free 函数原型: void* mallco(long NumBytes)该函数分配了NumBytes 个字节的内存空间并返回指向这块内存空间的指针 函数的参数是要分配的字节的长度 一般用sizeof函数求一下 所以mallco只知道要分配多少的字节 不知道分配的是个怎样的数据类型!!! 所以mallco原创 2017-12-12 10:43:28 · 259 阅读 · 0 评论 -
c++学习总结一
详见:http://blog.csdn.net/jinjie_ing/article/details/42741771 静态常量与非静态常量的区别 在创建对象的时候,需要每个成员变量(非静态)开辟内存空间,类变量(静态变量)则是在类加载的时候就创建好了。 用static修饰过的常量会存到常量池里面。存入的方式是:先到常量池里面寻找,看是否该常量已经存在,如果存在返回该常量的引用,不存在就在常量原创 2017-12-02 22:01:27 · 172 阅读 · 0 评论 -
oj问题
OJ 系统 输入输出 格式问题 常见的输入格式: 预先不知道输入数据的组数 读到文件结尾 预先知道输入数据的组数 先读入数据组数然后循环读入数据 只有一组数据预先不知道多少组数据while(cin>>a>>b){ cout << a+b << endl;}预先知道多少组数据cin >> n;for(int i=0;i<n;i++){原创 2017-12-11 12:04:51 · 445 阅读 · 0 评论 -
单列模式理解笔记
单例模式/** * 对象的实例化方法,也是比较多的,最常用的方法是直接使用new,而这是最普通的,如果要考虑到其它的需要,如单实例模式,层次间调用等等。 * 直接使用new就不可以实现好的设计好,这时候需要使用间接使用new,即getInstance方法。这是一个设计方式的代表,而不仅仅指代一个方法名。 * *//** * 1. new的使用: * 如Object _object =原创 2017-12-11 12:03:50 · 139 阅读 · 0 评论 -
c++强制类型转换笔记
强制类型转换类型转换是有风险的! 损失精度 越界 。。。 类型转换运算符 老的类型转换的方式: 类型转换操作符(type conversion operator)是一种特殊的类成员函数, 它定义将类类型值转变为其他类型值的转换。转换操作符在类定义体内声明,在保留字 operator 之后跟着转换的目标类型。 T1::operator T2() [const]; //T1的成员函数原创 2017-12-11 12:02:37 · 215 阅读 · 0 评论 -
作用域生存周期理解笔记
作用域 生存周期 存储位置 作用域是一个变量所作用的位置 生存周期是一个变量存在的时间 存储位置是一个变量存储的位置代码区:存放CPU执行的机器指令,代码区是可共享,并且是只读的。 数据区:存放已初始化的全局变量、静态变量(全局和局部)、常量数据。 BBS区:存放的是未初始化的全局变量和静态变量。 栈区:由编译器自动分配释放,存放函数的参数值、返回值和局部变量,在程序运行过程中实时分配和释原创 2017-12-11 12:01:14 · 144 阅读 · 0 评论 -
函数对象
函数对象一个类重载了圆括号运算符() 则该类的对象就成为了函数对象 一般只有函数和函数指针后面会跟圆括号 而这里是一种新的形式 看上去像是一个函数调用 但是这是一个对象 什么样的形参才能和函数相对应呢? 函数指针 注意函数指针的优先级问题 加上小括号表示为指针实参可以是一个临时变量或者对象 可以没有名字 因为只起一个给形参传递值得作用 形参有名字就可以了函数对象 作用很有意思 解决了函数原创 2017-12-11 11:59:00 · 134 阅读 · 0 评论