随笔分类 - C++11学习
摘要:最近在搞Android 开发,里面多线程的使用比较频繁,java多线程接口很方便。 Thread, AysncTask, Handler 这些接口比起posix提供的pthread_create()等一系列接口方便很多,想到C++11也支持方便的多线程编程,最近java中AsyncTask用的比...
阅读全文
摘要:据说再高的高手在写多线程程序的时候都难确保不会产生死锁,死锁的调试也就成为一个比较常见的问题,假设有下面这样一个问题: 一个正在生产环境下运行的进程死锁了,或者你只是在跑一个程序,并没有在调试器里面打开它,然后发现没有响应,日志输出也停止了。由于你是一个有经验的程序员,会想到“我刚刚加上了新的锁策略,不一定稳定,这可能是死锁了“。但是你不想就这么杀掉进程,因为多线程的 bug 不容易重现,遇上一次死锁可能要凭运气,错过了这次,它下次死锁可能会出现在你演示给老板看的时候……怎么办? 对于这样的问题可以借助Core Dump来调试。 什么是Core Dump? Core的意思是内存, ...
阅读全文
摘要:C++11 提供了新的获取系统时间的库函数,在获取时间的时候一般常用的是获取time since epoch,下面来看一下如何获取这个时间。 1 #include 2 #include 3 #include 4 #include 5 #include 6 constexpr int microSecPerSec = 1000000; 7 8 int main() 9 {10 std::chrono::time_point p1, p2, p3;11 struct timeval tv;12 int64_t mSecond;13 14 p2 = s...
阅读全文
摘要:原文地址:http://coolshell.cn/articles/10822.html作者:陈皓++++++++++++++++++++++++++++++++++++++++++++++当我们说起函数式编程来说,我们会看到如下函数式编程的长相:函数式编程的三大特性:immutable data 不可变数据:像Clojure一样,默认上变量是不可变的,如果你要改变变量,你需要把变量copy出去修改。这样一来,可以让你的程序少很多Bug。因为,程序中的状态不好维护,在并发的时候更不好维护。(你可以试想一下如果你的程序有个复杂的状态,当以后别人改你代码的时候,是很容易出bug的,在并行中这样的问
阅读全文
摘要:bind() 和 lambda 表达式都可以实现类似的功能,在使用的时候有时候不知道选择哪一个。这里来做一个简单的总结。主要参考了一下的文章:http://stackoverflow.com/questions/1930903/bind-vs-lambdahttp://www.gockelhut.com/c++/articles/lambda_vs_bind1. bind() 在多层嵌套的时候会使代码非常难看懂(参见文章一)2. lambda 不支持“多态性”(其实就是泛型),需要在定义的时候指定参数类型3. lambda 运行速度会比bind() 函数快很多4. lambda 可以通过 ..
阅读全文
摘要:#include <random>#include <iostream>#include <functional> void f(int n1, int n2, int n3, const int& n4, int n5){ std::cout << n1 << ' ' << n2 << ' ' << n3 << ' ' << n4 << ' ' << n5 <<
阅读全文
摘要:C++ 沉思录也算是C++中的经典书籍,其中介绍OO思想的我觉得很好,但是全书中贯穿了handle,使用引用计数等,也有点不适合现代C++的设计思想。这里使用shared_ptr 智能指针改写了“句柄”这一章的程序,明显使代码量下降,而且管理方便。下面来看代码:#include <iostream>#include <memory>using namespace std;class Point{public: Point() : xval(0),yval(0){}; Point(int x, int y): xval(x), yval(y){}; Point(const
阅读全文
摘要:shared_ptr的作用有如同指针,但会记录有多少个shared_ptrs共同指向一个对象。这便是所谓的引用计数(reference counting)。一旦最后一个这样的指针被销毁,也就是一旦某个对象的引用计数变为0,这个对象会被自动删除。shared_ptr 在 Technique report I 中已经出现,在effective C++ 中提到过shared_ptr 的使用,现在已经成为C++11 的正式成员。shared_ptr 的自动删除功能是一个很好的防止内存泄露的方法,在C++中也称为RAII(Resource Acquisition Is Initialization)..
阅读全文
摘要:Array 是一种大小固定的顺序容器。array 的申明:template <class T, size_t N>class array;Array内部只存储所包含的数据,哪怕是大小也只不过是个模板参数。和普通使用‘[]’语法申明的数组相比,只不过显得更加高效(操作高效),因为这个类添加了一系列的全局成员函数用来操作这些元素。下面来列一些主要的操作:// ‘[]’ 操作#include <iostream>#include <array> int main (){ std::array<int,10> myarray; unsigned int
阅读全文
摘要:这里主要实现两个线程间通信,当flag = 10 之后通知另外一个线程(也就是“Linux内核多线程(二)”中的程序的各种平台实现)。首先是C++ 11 的方式:#include <thread>#include <iostream>#include <mutex>#include <queue>#include <condition_variable>#include <atomic>using namespace std;const int M = 10;int main(){ mutex lockBuffer; in
阅读全文
摘要:下面是一个生产者消费者问题,来介绍condition_variable的用法。当线程间的共享数据发生变化的时候,可以通过condition_variable来通知其他的线程。消费者wait 直到生产者通知其状态发生改变,Condition_variable是使用方法如下:·当持有锁之后,线程调用wait·wait解开持有的互斥锁(mutex),阻塞本线程,并将自己加入到唤醒队列中·当收到通知(notification),该线程从阻塞中恢复,并加入互斥锁队列(mutex queue)线程被唤醒之后继续持有锁运行。Condition variable有两种类型:con
阅读全文
摘要:C++11开始支持多线程编程,之前多线程编程都需要系统的支持,在不同的系统下创建线程需要不同的API如pthread_create(),Createthread(),beginthread()等,使用起来都比较复杂,C++11提供了新头文件<thread>、<mutex>、<atomic>、<future>等用于支持多线程。使用C++11开启一个线程是比较简单的,下面来看一个简单的例子:#include <thread>#include <iostream>void hello(){ std::cout <<
阅读全文
摘要:C++11从去年开始接触的,首先接触的是boost,在VS2010上玩了一下,但是没有看太多。后面接触到C++11,第一个下载的资料室Scott Myers 的overview of C++0x,之后九月份C++11出了新标准,我下载了ISOICE14882 C++11的pdf,感觉看不懂,也没有太多时间研究这个,于是也就是当资料查查了。从去年末很多网络上的朋友都有在发一些C++11的文章,我也开始学习他们发的博客,然后结合自己的理解和上面提到的资料还有几个网站来学习,我这些程序都是在VC11下编译通过的。总共有几个部分:tuple,正则表达式,lambda表达式,多线程。我都是先写在wo..
阅读全文
摘要:下面一个例子将进行年月日格式的转换,将DD-MM-YYYY –> YYYY-MM-DD,其中‘.’或者‘/’都能正确识别。#include <regex>#include <iostream>#include <string>std::string format_date(const std::string& date){ // regular expression const std:: regex pattern("(\\d{1,2})(\\.|-|/)(\\d{1,2})(\\.|-|/)(\\d{4})"); //
阅读全文
摘要:下面来介绍和regex_match()很像的regex_search()的使用实例,regex_match()要求正则表达式必须与模式串完全匹配,regex_search()只要求存在匹配项就可以。#include <regex>#include <iostream>#include <string>int main(){ const std::tr1::regex pattern("(\\w+day)"); // the source text std::string weekend = "Saturday and Sunda
阅读全文
摘要:该实例通过一个函数is_email_valid 来检查一个email地址是否是一个正确的格式。如果格式正确则返回true。#include <regex>#include <iostream>#include <string>bool is_email_valid(const std::string& email){ const std::regex pattern("(\\w+)(\\.|_)?(\\w*)@(\\w+)(\\.(\\w+))+"); return std::regex_match(email, pattern)
阅读全文
摘要:C++11开始支持正则表达式,使得处理文本更加简洁方便。C++11 支持六种正则表达式语法:ECMAScript, basic(POSIX Basic Regular Expressions), extended(POSIX Extended Regular Expressions ), awk(POSIX awk) , grep(POSIX grep ), egrep(POSIX grep –E)。其中ECMAScript最为强大。闲话不多说,首先来看正则表达式有哪些基本类型。basic_regex: 这是一个包含一个正则表达式的模板类。通常有两种特化方式:a) typedef basic_
阅读全文
摘要:tuple元组定义了一个有固定数目元素的容器,其中的每个元素类型都可以不相同,这与其他容器有着本质的区别.是对pair的泛化。首先来介绍元组的创建和元组元素的访问。通过make_tuple()创建元组,通过get<>()来访问元组的元素。通过下面这段程序来认识这两个函数的用法:#include <iostream>#include <tuple>#include <functional>int main(){ auto t1 = std::make_tuple(10, "Test", 3.14); std::cout <
阅读全文
摘要:C++11引入了lambda表达式,使得程序员可以定义匿名函数,该函数是一次性执行的,既方便了编程,又能防止别人的访问。Lambda表达式的语法通过下图来介绍: 这里假设我们定义了一个如上图的lambda表达式。现在来介绍途中标有编号的各个部分是什么意思。Lambda表达式的引入标志,在‘[]’里面可以填入‘=’或‘&’表示该lambda表达式“捕获”(lambda表达式在一定的scope可以访问的数据)的数据时以什么方式捕获的,‘&’表示一引用的方式;‘=’表明以值传递的方式捕获,除非专门指出。Lambda表达式的参数列表Mutable 标识异常标识返回值“函数”体,也就是l
阅读全文