![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
allenxguo
C++
展开
-
Effective STL学习笔记-条款34
注意哪些算法需要有序区间小结一下书上:搜索算法binary_search、lower_bound、upper_bound和equal_range(参见条款45)需要有序区间因为它们使用二分法查找来搜索值。算法set_union、set_intersection、set_difference和set_symmetric_difference的四人组提供了线性时间设置它们名字所提出的操作的性能。m原创 2017-11-19 15:11:22 · 236 阅读 · 0 评论 -
【C++11】Lambda链式调用
实现一个链式调用的lambda表达式首先创建一个task对象,然后连续调用then的函数,只需要保证前一个函数的输出为后一个的输入即可。最后在需要的时候调用计算结果。 代码如下:(参考-深入应用C++代码优化与工程级应用3.3.4节)template<typename T>class Task;template<typename R, typename...A...原创 2018-03-04 22:07:42 · 1336 阅读 · 0 评论 -
【C++11】Tuple元组的辅助操作类实现(1)
Tuple元组类是C++11新引入的结构,它能容纳任意类型的元素,具备很多编译期计算的特性,tuple和其他C++11特性结合能成为更加强大的组件。本次介绍的是怎样便捷的打印tuple的所有元素。//递归打印tuple的数据template<typename Tuple, size_t N>struct TupleOpt{ static void prin...原创 2018-03-27 20:57:05 · 323 阅读 · 0 评论 -
【C++11】Tuple元组的辅助操作类实现(2)
获取索引上一章节讲解了如果打印整个tuple,这次根据一个值获取该值在tuple的下标。代码如下:namespace TupleOperation{ //根据元素值获取索引 //如果2个类型可以互换则返回类型为bool类型 template<typename T, typename U> typename std::enable_if&...原创 2018-03-27 21:38:32 · 222 阅读 · 0 评论 -
【C++11】shared_ptr
C++内存管理C++11提供了3种智能指针:shared_ptr,unique_ptr, weak_ptr引用自头文件memory。基本用法可以直接查找文档,这里有些需要注意的地方。不要用一个原始指针初始化多个shared_ptr int* ptr = new int(); std::shared_ptr<int> p1(ptr);...原创 2018-04-17 21:06:31 · 363 阅读 · 0 评论 -
【C++11应用实践系列】
关于C++11应用实践系列大多都是参考自:&amp;amp;amp;lt;深入应用C++11代码优化与工程&amp;amp;amp;gt;这本书,以及自己的一些理解,平时使用的用法等等。1、Lazy类的实现 2、Lambda链式调用 3、Any类的实现 4、Tuple元组的辅助操作类实现(1) 5、Tuple元组的辅助操作类实现(2) 6、shared_ptr 7、unique_ptr 8、weak_ptr 9、thread...原创 2018-04-22 14:43:17 · 1610 阅读 · 0 评论 -
【C++11】unique_ptr
unique_ptr它是一个独占型指针,不允许共享指针内容,也不允许智能指针赋值操作。 unique_ptr<int> ptr(new int(2)); //unique_ptr<int> ptr1 = ptr; //error 不可复制 unique_ptr<int> ptr2 = std::mov...原创 2018-04-22 15:20:32 · 534 阅读 · 0 评论 -
【C++11】weak_ptr
基本用法弱引用weak_ptr主要是监视shared_ptr,不会使引用计数增加。 基本用法如下:std::weak_ptr<int> rptr;void testFunction(){ if (rptr.expired()) { cout << "shared_ptr release" << endl; ...原创 2018-04-22 16:11:37 · 294 阅读 · 0 评论 -
【C++11】thread线程库
C++11thread库主要用法如下:void sleep_thread(){ cout << "enter thread:" << std::this_thread::get_id() << endl; std::this_thread::sleep_for(std::chrono::seconds(3)); cout &...原创 2018-05-05 10:42:46 · 519 阅读 · 0 评论 -
【C++11】异步操作
C++11异步操作主要有std::future、std::promise和std::package_task。 std::future作为异步结果的传输通道,可以很方便的获取线程函数的返回值。 std::promise用来包装一个值,将数据和future绑定起来,方便线程赋值。 std::package_task用来包装一个可调用对象,将函数和future绑定起来以便异步调用。 最后还...原创 2018-05-05 11:14:16 · 1611 阅读 · 0 评论 -
【Python】bisect二分查找
流畅的python 2.8bisect搜索bisect可以在一个列表中查找一个可以插入某元素的位置,并且该位置可以保持插入元素之后,列表依旧保持升序。 可以使用bisect查找位置index,然后使用list.insert(index, value)。也可以直接使用insort完成。lists1 = [1,3,5,7,9]lists2 = [2,4,6,7,8]PR...原创 2018-06-13 22:49:50 · 618 阅读 · 0 评论 -
【C++11】Lazy类的实现
介绍惰性求值一般用于函数式编程语言中。在使用延迟求值的时候,表达式不在它绑定到变量时就求值,而是等到真正需要的时候再求值。 惰性求值类,目前C++中还没有相应的实现。但是可以借助lamda表达式,将函数封装到lamda中即可。代码实现#include <iostream>#include <functional>#include <memor...原创 2018-03-01 22:31:55 · 1871 阅读 · 4 评论 -
【C++11】Any类的实现
boost库有一个Any类,是一个特殊的只能容纳一个元素的容器,他可以擦除类型,给任何类型赋值。boost::any a = 1;boost::any a = 1.1;std::vector&amp;lt;boost::any&amp;gt; v;v.push_back(a);v.push_back(b);int va = boost::any_cast&amp;lt;int&amp;gt;(a);......原创 2018-03-14 21:33:32 · 6923 阅读 · 4 评论 -
LeetCode刷题记录4-有效的括号
题目由于只包含字符的字符串’(‘,’)’,’{‘,’}’,’[‘和’]’,确定输入字符串是有效的。 括号必须关闭以正确的顺序,”()”并且”()[]{}”都是有效的,但”(]”并”([)]”没有效。思路首先我想改题目设计的括号种类肯定是可变的,但是每一种符合又是关联的,所以我想到的办法是使用pair来存每一对符号,这样即使增加新的符号同样适用。 所以我是用了unordered_map来存储。原创 2017-11-20 22:37:49 · 648 阅读 · 0 评论 -
Effective STL学习笔记-条款38
把仿函数类设计为用于值传递仿函数大家都应该知道,看一下for_each的函数声明:template<class InputIterator,class Function>Function // 注意值返回for_each(InputIterator first,InputIterator last,Function f); // 注意值传递但是书写仿函数有一点小约定:你的函数对象应该很小。否则原创 2017-11-30 22:21:02 · 234 阅读 · 0 评论 -
Effective STL学习笔记-条款45-50
注意count、find、binary_search 、lower_bound、upper_bound和equal_range的区别下面这张图可以说明一切,根据情况选择适当的方法:原创 2017-12-09 20:39:39 · 264 阅读 · 0 评论 -
【Effective STL系列】
前言本书是针对STL的经验总结,书中列出了50个条款,绝大多数条款都解释了在使用STL时应该注意的某一个方面的问题,并且详尽地分析了问题的来源、解决方案的优劣。这是作者在教学和实践过程中总结出来的经验,条款中的内容值得我们学习和思考。在学习这本书的时候,我会结合c++一些新特性,对比学习。汇总Item1、仔细选择你的容器 Item8&9、根据容器类型选择合适的删除方式 Item13&14、尽量使原创 2017-08-31 07:26:37 · 298 阅读 · 0 评论 -
Effective STL学习笔记-条款39
用纯函数做判断式判断式是返回bool(或者其他可以隐式转化为bool的东西)。判断式在STL中广泛使用。标准关联容器的比较函数是判断式,判断式函数常常作为参数传递给算法,比如find_if和多种排序算法。纯函数是返回值只依赖于参数的函数。如果f是一个纯函数,x和y是对象,f(x, y)的返回值仅当x或y的值改变的时候才会改变。一个判断式类是一个仿函数类,它的operator()函数是一个判断式原创 2017-12-02 15:11:19 · 202 阅读 · 0 评论 -
Effective STL学习笔记-条款40
使你的仿函数可适配举个例子,假设我有一个Widget*指针的list和一个函数来决定这样的指针是否确定一个感兴趣的Widget:class Widget {};bool isInsteresting(const Widget* pw) { return true; }查找第一个感兴趣的widget,这很容易:auto iter = std::find_if(widgetPtrs.begin(),原创 2017-12-02 15:40:20 · 209 阅读 · 0 评论 -
Effective STL学习笔记-条款36
了解copy_if的正确实现先看copy和copy_if的使用小demo: vector<int> from(10); std::iota(from.begin(), from.end(), 0); //0 - 9 vector<int> to; //copy std::copy(from.begin(), from.end(), back_in原创 2017-11-26 16:23:48 · 193 阅读 · 0 评论 -
Effective STL学习笔记-条款43
尽量用算法调用代替手写循环每个算法接受至少一对用来指示将被操作的对象区间的迭代器。比如,min_element可以找出此区间中的最小的值,而accumulate则对区间内的元素作某种形式的整体求和运算(参见条款37),partition将区间内的元素分割为满足和不满足某判决条件的两个部分(参见条款31)。当算法被执行时,它们必须检查指示给它的区间中的每个元素,并且是按你所期望的方式进行的:从区间的起原创 2017-12-05 22:03:52 · 232 阅读 · 0 评论 -
Effective STL学习笔记-条款44
尽量用成员函数代替同名的算法有些容器拥有和STL算法同名的成员函数。关联容器提供了count、find、lower_bound、upper_bound和equal_range,而list提供了remove、remove_if、unique、sort、merge和reverse。大多数情况下,你应该用成员函数代替算法。这样做有两个理由。首先,成员函数更快。其次,比起算法来,它们与容器结合得更好(尤其是原创 2017-12-06 22:50:10 · 224 阅读 · 0 评论 -
LeetCode刷题记录8-根据条件反回指定字符串
题目给定一个数字字符串,返回数字可能表示的所有可能的字母组合。 数字到字母的映射(就像电话上的按钮一样)如下所示。 Input:Digit string "23"Output: ["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].实现思路,使用了3层for循环,效率://分割一个例如"abc" => 为一个{"a","原创 2018-01-23 00:49:08 · 174 阅读 · 0 评论 -
【C++】杂记
本系列博客主要记录C++中一些很方便的特性,实现方式,技巧以及坑等等。正题: 1、内存对齐和简单的内存管理原创 2018-06-10 13:27:50 · 170 阅读 · 0 评论 -
【C++】内存对齐和简单的内存管理
内存管理自己申请一个内存块,用来存放构造的数据,使用placement new在内存上构造数据。 示例://待操作的数据struct Data { Data(int _a, char _b, double _c) :a(_a), b(_b), c(_c) {} int a; char b; double c;};class Bloc...原创 2018-06-10 14:50:35 · 791 阅读 · 0 评论 -
【C++11】改进观察者模式
经典的观察者模式先看一下GOF的经典观察者模式,主题类Subject中包含的观察者的列表,并且提供attach、detach以及notify通知接口。通知后调用观察者的虚接口。使用C++11改进template<typename Func>class Events{public: //注册观察者 int connect(Func&&am...原创 2018-06-19 22:27:19 · 413 阅读 · 0 评论 -
【C++11】对象消息总线(2)
本系列文档从属于:C++11应用实践系列部分Demo和结论引用自&amp;lt;深入应用C++11代码优化与工程&amp;gt;这本书消息总线消息总线设计思想前一节已经介绍了,如何承载消息,本节将会实现,消息保存和分发。消息保存:由于消息类型有不同的返回值以及入参,这里可以使用之前介绍的Any作为消息载体消息分发:这个就比较容易了,取出合适的函数对象(消息)直接调用即可。消息总线设计思想消息...原创 2018-09-18 22:40:55 · 1962 阅读 · 2 评论 -
【项目调优小结】状态机优化业务交互
ing原创 2018-09-25 22:57:47 · 220 阅读 · 0 评论 -
【算法】使用栈计算简单的后缀表达式
###计算后缀表达式计算简单的后缀表达式,形如:“231*+9-”主要还是利用了栈的特性,先入后出。计算的简略步骤如下:第一个元素是2,将其入栈。此时栈元素为2遇到3,将其入栈。此时栈元素为23遇到1,将其入栈。此时栈元素为231遇到操作,弹出2个数字进行乘法操作(先出1,后出3,计算方式为31),将结果3入栈。此时栈元素为23遇到+操作,弹出2个数字进行乘法操作(先出3,后出2,...原创 2018-09-20 22:56:24 · 1756 阅读 · 0 评论 -
【算法】选择排序
选择排序概述从1-N,循环遍历,每次从剩下的序列中选择最大或者最小的元素放到剩下序列的前一个。n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果:初始状态:无序区为R[1…n],有序区为空。第1趟排序在无序区R[1…n]中选出关键字最小的记录R[k],将它与无序区的第1个记录R[1]交换,使R[1…1]和R[2…n]分别变为记录个数增加1个的新有序区和记录个数减少1个的...原创 2018-10-06 12:31:26 · 228 阅读 · 0 评论 -
【深入理解C++11】
深入理C++11第一章第二章第三章继承构造函数使用using声明注意继承构造函数使用过多造成的冲突问题第一章第二章第三章继承构造函数派生类可以自动获得从基类的成员变量和接口,如果派生类需要使用基类的构造函数,通常需要在构造函数显示声明:struct A { A(int) {} };struct B { B(int i) : A(i) {} };如果构造函数非常多,我们就需要把每个...原创 2018-10-24 22:53:32 · 454 阅读 · 0 评论 -
【深入理解C++11】第三章 通用为本,专用为末
通用为本,专用为末3.1 继承构造函数3.1.1 使用using声明3.1.2注意继承构造函数使用过多造成的冲突问题3.2 委派构造函数3.3 右值引用:移动语义和完美转发3.3.1 指针成员与拷贝构造3.3.2 移动语义3.3.3 左值、右值与右值引用3.3.4 强制转化为右值3.3.5 移动语义的一些其他问题3.3.6 完美转发3.5 列表初始化3.5.1 初始化列表3.5.2 防止类型收窄3...原创 2018-12-24 22:25:12 · 348 阅读 · 0 评论 -
【深入理解C++11】第四章 新手易学,老兵易用
深入理C++114.2 auto类型推导4.3 decltype4.3.1 typeid与decltype4.3.2 decltype的应用4.3.3 decltype推导四规则4.3.4 cv限制符的继承与冗余的符号4.4 追踪返回类型4.4.1 追踪返回类型的引入4.4.2 使用追踪返回类型的函数4.5 基于范围的for循环4.2 auto类型推导auto在C++11中有了新的定义,例如a...原创 2018-12-24 22:26:48 · 262 阅读 · 0 评论 -
【深入理解C++11】第五章 提高类型安全
深入理C++115.1强类型枚举5.1强类型枚举普通枚举在全局区域存在相同的名字则会编译异常例如:enum Type{General, Light, Medium};enum Category{General, Light, Medium};C++11引入强类型枚举,即“枚举类”。enum class Type{General, Light, Medium};他有以下几点优势:...原创 2018-12-24 22:27:36 · 210 阅读 · 0 评论 -
【深入理解C++11】第六章 提高性能及操作硬件能力
现在各类语言百花齐放,大多都有很高的开发效率、或者专用场合使用,但是性能方面C++程序通常会有不可比拟的优势。C++11中我们可以进一步发掘程序运行性能。深入理C++116.1 常量表达式6.1.1 常量表达式函数6.1.2 常量表达式值6.1.3 常量自定义类型6.1.4 常量表达式其他应用6.2 变长模板6.2.1 变长函数和变长模板参数6.2.2 变长模板:模板参数包和函数参数包6.2....原创 2019-02-02 17:52:40 · 357 阅读 · 0 评论 -
【深入理解C++11】第七章 为改变思考方式而改变
深入理C++117.1 指针空值 nullptr7.1 指针空值 nullptr 在C++中一般一个指针声明都是char* p = NULL;表示一个指针处于初始化状态,NULL一般是一个宏定义,定义如下:#ifndef NULL #ifdef __cplusplus #define NULL 0 #else #define NULL ((vo...原创 2019-04-22 22:31:08 · 181 阅读 · 0 评论 -
【C++11】对象消息总线(1)
本系列文档从属于:C++11应用实践系列 部分Demo和结论引用自&amp;amp;amp;amp;amp;amp;lt;深入应用C++11代码优化与工程&amp;amp;amp;amp;amp;amp;gt;这本书什么是消息总线?对象的关系之间一般有:依赖、关联、聚合、组合和继承,他们的耦合程度也是依次加强!未完待续。。先整理文章...原创 2018-09-11 22:56:51 · 3886 阅读 · 0 评论 -
【IoC容器】C++实现
Ioc容器是什么是为了实现某种机制,让某一对象创建不再直接依赖于外部对象创建。外界通过需求灵活的配置这种机制创建对象,这种机制称为控制反转(Inversion of Control, IoC). 我们一般通过依赖注入,将对象创建的依赖关系注入目标对象的构造函数中!比如A对象依赖于B对象的关系注入到A类对象的构造函数中。IoC实现细节IoC实际上具有两种能力:对象的工厂能力,可以...原创 2018-08-29 22:33:08 · 5598 阅读 · 3 评论 -
【C++11】实现对象池
#对象池对象池顾名思义,就是存放一堆对象的池,目前一般的实现方式大多都是如下思路:初始化创建一些系列(或者从外部加载)从对象池取出一个对象使用用完之后返回对象池对象池有很多场景都可以使用,例如:一个对象构造很消耗时间,又或者一些对象被很频繁的使用,都可以使用对象池它的思想类似于数据库连接池,网络句柄连接池等等。在C ++中借助智能指针,可以很方便的实现一个对象池,智能指针可...原创 2018-07-23 21:18:13 · 3928 阅读 · 0 评论 -
【3rdparty】cereal简介
cereal 这里是官方文档:http://uscilab.github.io/cereal/index.htmlCereal是一个仅包含头文件的C ++ 11序列化库。 Cereal采用任意数据类型并可逆地将它们转换为不同的表示形式,例如紧凑的二进制编码,XML或JSON。 Cereal是一个快速、轻量级、易于扩展、没有外部依赖性的库,可以很容易地与其他代码集成或单独使用。...翻译 2018-07-29 13:13:33 · 1789 阅读 · 0 评论