
C++
文章平均质量分 75
Rechar_Deng
Still & Will
展开
-
jsoncpp使用方法
一、摘要 JSON 的全称为:JavaScript Object Notation,顾名思义,JSON 是用于标记 Javascript 对象的,JSON 官方的解释为:JSON 是一种轻量级的数据传输格式。本文并不详细介绍 JSON 本身的细节,旨在讨论如何使用 C++ 语言来处理 JSON。关于 JSON更具体的信息,可参见 JSON 官网:http://www.json转载 2015-11-23 09:35:39 · 826 阅读 · 0 评论 -
STL中排序相关算法选择
在STL中与排序相关的算法有:sort、stable_sort、partial_sort、nth_element、partion以及stable_partion,以下总结摘自effective C++:算法sort、stable_sort、partial_sort和nth_element需要随机访问迭代器,所以它们可能只能用于vector、string、deque和数组。对标准关联容器排序元素原创 2013-10-09 17:01:15 · 753 阅读 · 0 评论 -
boost::barrier同步原理
boost::barrier是多线程的同步点,构造函数会要求传递一个数字,表示需要同步多少个线程。只有指定个数的线程到达这个点之后,程序才会继续往下走,否则会阻塞。其实barrier的同步原理很简单。要明白它的同步原理,我们首先来看barrier的源码:class barrier { static inline unsigned int check_counter(unsign原创 2015-11-04 21:25:04 · 3727 阅读 · 0 评论 -
确保线程执行函数体正确使用引用传递
1、前言 在启动一个线程时,我们首先需要定义一个线程执行体,这个可执行体可以是函数、仿函数或者lambda表达式。并且它们可以拥有任意数量的参数。如, auto thHandler = std::thread([](){cout 以上一行代码运行时,会启动一个新的线程,线程的执行体为一个lambda表达式,这个线程会在控制台中高输出“a new thread“。原创 2015-10-28 18:30:29 · 3518 阅读 · 2 评论 -
RAII(Resource Acquisition Is Initialization资源获取即初始化 )思想
一、定义 RAII,Resouce Acquisition Is Initialization,翻译成中文的意思就是资源获取即初始化,RAII主要用于保证申请的资源得到正确的释放。最初由Bjarne Stroustrup提出,为了保证资源能够正确的得到释放,RAII原则是所有的资源都必须有管理对象,而资源的申请操作在管理对象的构造函数中进行,而资源的回收则在管理对象的析构函数中进行。原创 2015-11-17 15:49:14 · 2322 阅读 · 0 评论 -
C++对象池实现
在实际中,我们会遇到一个类最多只允许若干个对象同时存在的情形。如果这个类的对象会被频繁的创建,使用并销毁,那这时会对系统性能造成影响,而这时可以考虑使用对象池的方法来避免每次使用对象都需要从“构造->使用->销毁”这个流程,对象池中的每个对象都一次构造多次使用,而析构也只会在对象池析构是才会发生。 要实现对象池,那关键问题就在于如果在对象析构时不是真正的析构,而是重新回到对象池中。假如我原创 2015-12-10 11:58:59 · 1238 阅读 · 0 评论 -
用boost::tokenizer分割字符串
说明:本文是boost::tokenizer类的整理,原文出处为boost的document,此处仅作学习笔记之用。1、boost::tokenizerboost::tokenizer提供了一种灵活、易用的方式来将一个字符串分解为一个字符串列表。这是个模板类,类的声明为:template < class TokenizerFunc = char_delimiters原创 2015-11-23 18:08:36 · 3170 阅读 · 0 评论 -
pImp机制--隐藏实现减小头文件依赖
pImp是private implemention的缩写。在C++中,当需要引用其他头文件中定义的类、函数、变量时,需要在应用前将需要的头文件包含到当前的文件中。如, //头文件"A.h" #pragma once class A { ... } //头文件"B.h" #pragma once #i原创 2015-11-19 10:08:34 · 1910 阅读 · 0 评论 -
vector、map还是unordered_map?
一、引言 当我们需要使用键值对的情况时,通常我们会使用map或者unordered_map。其中map底层是采用红黑树实现的,它的查询复杂度是O(lgn);unordered_map实际上是hash_map的实现,理论上它的查询复杂度是O(1)的。那么当我们需要使用键值对结构时,我们是否就一定需要使用它们,或者说它们就一定是最好的选择呢? 答案是否定的,实际上我们可以使原创 2015-11-11 15:13:34 · 6622 阅读 · 4 评论 -
std::mem_fun vs std::mem_fn, std::bind1st/std::bind2nd vs std::bind
1.mem_fun vs mem_fn在C++ 11之前,当需要使用STL算法对容器中的对象一次调用成员函数时,我们需要使用到mem_fun或者mem_fun_ref,至于mem_fun和mem_fun_ref之间的选择根据容器中存储的对象是对象指针还是对象本身来选择,其中mem_fun针对对象本身,而mem_fun_ref则针对对象本身。例如,class T{pu原创 2015-11-23 15:26:02 · 2343 阅读 · 0 评论 -
在C++中使用openmp进行多线程编程
声明:本文是基于Joel Yliluoma写的Guid into OpenMP:Easy multithreading programming for C++而写的,基本是按照自己的理解,用自己语言组织的。其中大部分例子依然用原来文章的例子。前言多线程在实际的编程中的重要性不言而喻。对于C++而言,当我们需要使用多线程时,可以使用boost::thread库或者自从C++ 11开始原创 2015-11-13 15:53:40 · 38671 阅读 · 8 评论 -
C++异常机制的实现方式和开销分析
原文链接:http://baiy.cn/doc/cpp/inside_exception.htmC++异常机制的实现方式和开销分析白杨http://baiy.cn 在我几年前开始写《C++编码规范与指导》一文时,就已经规划着要加入这样一篇讨论 C++ 异常机制的文章了。没想到时隔几年以后才有机会把这个尾巴补完 :-)。还是那句开场白:“在恰当的场合使用恰当的特性” 对每转载 2013-11-07 09:44:16 · 819 阅读 · 0 评论 -
Effective modern C++ 条款37:基于任务编程优先于基于线程编程(Prefer task-based programming to thread-based)
有两种方法可以用来异步的运行一个函数doAsynWork。你可以创建一个std::thread来运行doAsynWork,以下是基于线程(thread-based)的方法: intdoAsyncWork(); std::thread t(doAsyncWork); 或者你可以将doAsynWork作为参数传入std::async,这种方法翻译 2015-10-15 09:53:07 · 1423 阅读 · 0 评论 -
c++ error 2064: term does not evaluate to a function taking 1 arguments解决方法
首先来看一个简单的示例:class T{public: T() = default; ~T() = default; int convertToInt(double x) { return ceil(x); } void doSomething() { vector vecD{ 2.5, 3.0原创 2015-11-23 12:45:57 · 10798 阅读 · 0 评论 -
明白volatile的意义
在C++编程中,很少会用到volatile变量,所以很多人并不清楚volatile变量的意义。其实volatile关键字是用于告诉编译器,它所声明的变量的内存位置是一块特殊内存,而非普通内存。而何为普通内存呢?让我们来看一下以下代码:int x = 10;int y = x;y = x;对于以上代码,其实第二次”y = x;”的调用是多余,编译器实际上很有可能会将这段代码进行优原创 2015-11-16 09:52:07 · 864 阅读 · 0 评论 -
遇见gtest--函数参数化测试
1、前言 有时为了完整的测试一个函数的正确性,我们需要测试给定各种不同输入的情况下,函数的输出是否正确。最直接的方法就是我们手动去给不同输入,然后测试输出是否正确。但是这种方式工作量大,并且都是重复性,无意义的操作。为此,gtest中提供了参数化的测试。2、参数化测试使用方法 要使用参数化测试,我们需要创建一个子类继承testing::TestWithParam原创 2015-11-12 09:30:58 · 5981 阅读 · 0 评论 -
遇见gtest--事件
1、前言 在单元测试中,我们经常需要在某个测试套件、测试用例或者整个测试运行之前进行前置条件设置及检查,或者运行之后对运行结果进行校验等操作。在gtest中,称之为事件机制。gtest将事件按照作用的范围不同进行划分,从大到小总共分为3个层次: 1)整个测试层面,即在测试工程开始前和结束后进行; 2)测试套件层面,即在某个测试套件开始前和结束后进行; 3)测原创 2015-11-02 20:52:44 · 2802 阅读 · 0 评论 -
如何干掉那又丑又长的switch..case语句
1、前言 在实际的编程中,我们经常会使用到switch..case语句,这通常也是对一长串if..else if语句的优化。对于一些简单的情况(只每个case代码中代码长度不会很长,而且case分之并不多的情况),用switch..case语句即可,此时代码的可读性并不会很差,结构也算是清晰。但是一旦case分支数目众多,每个case语句块中代码长度也很长,这时对于维护这段代码的同学则是原创 2015-10-27 09:41:46 · 19916 阅读 · 0 评论 -
遇见gtest--断言
1、前言 作为一个成熟的单元测试框架,gtest自然拥有一些用于判断值是否与期望一致的断言。在gtest中,断言分为两大类:ASSERT_*和EXPECT_*。它们的区别在于,ASSERT_*类断言在失败时,会立即退出当前的测试用例(即其所在的函数,但不会结束整个测试);EXPECT_*类断言在失败时,会继续执行,不会退出当前测试用例。 在每一个大类中,有分为多个小类别,它们分原创 2015-10-22 09:53:21 · 6165 阅读 · 0 评论 -
遇见gtest -- HelloGtest
1、前言 对于一个成熟的系统,为了保证系统正确的运行,测试代码量与功能代码量应该是相当的。对于C++而言,目前已经有一些单元测试框架,如gtest。本文对gtest的使用做一个简单的介绍。2、第一个测试用例 作为使用gtest的第一个用例,我们用以下示例来示范gtest的使用方法: #include "gtest/gtest.h" bool isEv原创 2015-10-21 09:40:08 · 942 阅读 · 0 评论 -
Effective modern C++ 条款 40:注意不同线程句柄的析构函数的行为
Item 39提到,一个joinable的std::thread对象对应了一个执行线程。一个非延迟任务(见Item 38)的std::future对象与系统线程也有类似的关系。因此,std::thread和std::future对象都可以看作线程的句柄。 从这个角度来看,std::thread和std::future的析构函数的区别如此之大就变得很有趣了。如Item 39所述,析构一个j翻译 2015-10-19 09:23:11 · 1915 阅读 · 0 评论 -
Effective modern C++ 条款 39:让std::thread在所有路径上不可join(Make std::threads unjoinable on all paths)
每个std::thread对象都处于两种状态之一:joinable和unjoinable。一个joinable的std::thread对象对应一个正在运行或处于可以运行状态的异步执行的线程。例如,一个处于阻塞状态或者等待被调度的线程是joinable的。 一个unjoinable的线程正如你所期待的:它不可以被join。unjoinable的std::thread对象包括:默翻译 2015-10-19 09:18:32 · 2100 阅读 · 1 评论 -
Effective modern C++ 条款 38:如果异步至关重要请指定std::launch::async
当你调用std::async来执行一个函数(或其他可执行体),你通常是想要异步执行这个函数的。但是std::async并不一定会那样做。实际上你是在要求函数按照std::async默认启动策略来运行函数。有两个标准策略,它们分别代表std::launch中的一个scoped枚举(详见Item10)。假设一个函数 f 被传至std::async来执行,std::launch::async翻译 2015-10-16 09:52:19 · 2202 阅读 · 0 评论 -
LevelDB源码分析之从Put说起
之前分享的文章leveldb实现原理分析详细描述了LevelDB的实现原理,本文从Put接口来看下leveldb数据写流程的源码实现。LevelDB的读写接口在类DB中定义(leveldb/db.h),接口声明如下:// Set the database entry for "key" to "value". Returns OK on success, // and a non-OK st...原创 2018-03-10 17:25:57 · 1077 阅读 · 0 评论