C++ 11一个比较显著的变化是以前boost库中的一些函数被正式标准化合入到STL中了,本文就简单的介绍一下。

引用包装器(Reference Wrapper)

当模板函数参数为泛型类型的时候,无法推导出是传值还是传引用,默认情况下会使用传值的方式。这是我们可以用std::ref显式指定以传引用的方式实例化模板函数。

#include <functional>
    #include <iostream>

template <class T>
    void foo(T arg)
    {
        arg++;
    }

int main()
    {
        int count = 3;

foo(count);        //此时传的是值,模板实例化为foo(int),count值不变
        std::cout << count << std::endl;

foo(std::ref(count));    //此时传的是引用,模板实例化为foo(int&),count值加1
        std::cout << count << std::endl;
    }

智能指针(Smart Pointers)

智能指针主要引入了shared_ptr、weak_ptr、unique_ptr三种,其中shared_ptr和weak_ptr就是boost库中的应对象,我以前也写过相关文章介绍他们,这里就不介绍了。

而新引入的unique_ptr和以前介绍过的boost库中的scoped_ptr比较类似,而STL中本身就有一个类似的auto_ptr,它们之间的主要区别是:

  • auto_ptr可以支持'='操作,也可作为函数的返回值
  • unique_ptr不支持'='操作,可以作为函数的返回值
  • scoped_ptr即不支持'='操作,也不能作为函数的返回值

相比较而言,unique_ptr权限比auto_ptr小,也没有scope_ptr不能作为返回值的限制,是用起来最合适的,完全可以代替auto_ptr

仿函数

四个boost库也合入了stl库中:

  • function
  • bind
  • result_of
  • mem_fn

其中function和bind我以前在介绍boost库中已经介绍过,在支持auto关键字后,通过bind创建function更加简单了,我们只需要用一句话就能创建成员函数的仿函数。

#include <iostream>
    #include <functional>
    using namespace std;
    using namespace std::placeholders;

struct X
    {
        bool foo (int a) { cout<< a << endl; return false;}
    };

int main()
    {
        X x;

auto func = bind(&X::foo, &x, _1);
        func(5);
    }

PS:使用bind的时候需要加入std::placeholders的using,否则编译报语法错误。

不过感觉bind基本上被lambda表达式给秒了,对于上面例子里,用lambda表达式的写法如下:

auto func = [&x](int a) { x.foo(a); };
    function<void (int)> func = [&x](int a) { x.foo(a); };

由于lambda表达式是语法糖,因此可读性方面更好(感觉简洁度都快接近C#的匿名函数了),没有_1,_2之类的占位符,对于函数的调用方式也是显式直接调用,更加直观。

而result_of在auto引入后感觉也基本上没有用了,直接使用auto要简单得多。

容器

容器方面主要加了如下几个:

  1. tuple
  2. array
  3. unordered_set和unordered_map

其中tuple和array基本上就是boost相关库给标准化了,而unordered_set和unordered_map则是hash表方式的set和map,以提供更高的查询性能。使用方式和原来二叉树版的也大同小异,这里就不多介绍了。

正则表达式

Boost的regex库也终于标准化了,要使用字符串处理的可以不用到处找第三方的正则表达式库了。不过目前VC还不支持像C#那样取消转义字符(gcc可以),在代码里面的正则表达式依然非常难读,希望MS能尽快把raw string literal给支持上。

线程

Boost的线程库也标准化了,另外那个类似于.Net TPL库的packaged_task也标准化了,由于它有不少可以介绍的地方,我会专门写篇文章来介绍它,这里就不多说了。

时间函数

其实C语言标准库是提供了时间函数的,不过极度难用,现在Boost的时间函数chrono已经给标准化了,虽然还是比不上.Net的TimeSpan好用,但起码比标准C的那套好太多了。

#include <iostream>
    #include <chrono>
    #include <ctime>
    using namespace std;

int fibonacci(int n)
    {
        if (n < 3) return 1;
        return fibonacci(n-1) + fibonacci(n-2);
    }

int main()
    {
        auto start = chrono::system_clock::now();
        int result = fibonacci(40);
        auto end = chrono::system_clock::now();

int elapsed_seconds = chrono::duration_cast<chrono::milliseconds>
                                 (end-start).count();

auto end_time = chrono::system_clock::to_time_t(end);

std::cout << "result: " << result << endl
                 << "finished computation at " << std::ctime(&end_time)
                 << "elapsed time: " << elapsed_seconds << "ms\n";
    }

另外一个日期函数Boost.Date好像还没有标准化,要用到日期相关功能还是只能用boost库。

C++11 中STL库中新增内容相关推荐

  1. STL库中string类内存布局的探究

    在STL中有着一个类就是string类,他的内存布局和存储机制究竟是怎么样的呢? 这就是建立好的string 可以看出,图中用黄色框框标注的部分就是主要区域 我们用来给string对象进行初始化的字符 ...

  2. oracle urlencode 中文,Python2和Python3中urllib库中urlencode的使用注意事项

    前言 在Python中,我们通常使用urllib中的urlencode方法将字典编码,用于提交数据给url等操作,但是在Python2和Python3中urllib模块中所提供的urlencode的包 ...

  3. Allegro中封装库中的封装更新到PCB中出现焊盘中心错位

    Allegro中封装库中的封装更新到PCB中出现焊盘中心错位 今天在画一个板子的时候,直接复制的上一个工程的LIB,在导入原理图网表更新后,焊盘中心出现错位. 使用的是一个锅仔片的封装,出现错误如下图 ...

  4. C++STL库中不可或缺的部分—string(模拟实现)

    前文 大家好,本篇文章主要是讲解一下 string一些常用接口的模拟实现. 众所周知,在日常生活中,字符串无处不在,如 ''just do it'',''中国'',''一坤年''等,想要在计算机上将这 ...

  5. Oracle Dataguard中备库中归档日志不同步

    环境:RAC+单机 Dataguard 问题:启动备库到ADG模式时,发现后台归档日志并不同步 1.在备库中发现日志的归档日志不同步,内容如下: MRP0: Background Media Reco ...

  6. python3 urlencode_Python2和Python3中urllib库中urlencode的使用注意事项

    前言 在Python中,我们通常使用urllib中的urlencode方法将字典编码,用于提交数据给url等操作,但是在Python2和Python3中urllib模块中所提供的urlencode的包 ...

  7. 关于Python中turtle库中简单函数的解释

    turtle库中简单绘制函数 关于窗口 turtle.setup(width,height,startx,starty)** 用于设置绘图窗口的位置,width为窗口的长,height为窗口的宽,st ...

  8. c++中STL库 简介 及 使用说明

    致谢:http://www.cppblog.com/bhjjkg/articles/94514.html 该文章讲的很清楚! 作为C++标准不可缺少的一部分,STL应该是渗透在C++程序的角角落落里的 ...

  9. C++STL库中的map容器

    map简介 map是STL中的一个关联式的容器,可以建立key(first)和value(second)一对一的联系,由key映射到value. map内部自建了一棵红黑二叉树,可以对数据进行自动排序 ...

最新文章

  1. atitit.跨语言实现备份mysql数据库 为sql文件特性 api 兼容性java c#.net php js
  2. Spring MVC的@PostMapping注解
  3. Android简单手势滑动的识别
  4. BEGIN-4 Fibonacci数列
  5. Dotnet Core应用跨框架版本运行
  6. 【定时同步系列1】定时同步之MARTIN OERDER算法原理与公式推导
  7. Redis在windows下的配置
  8. ads design environment_ADS应用技巧3 — 画一个巴伦有多少种方法?
  9. eclipse连接MySQL
  10. C++面试题-面向对象-构造函数和析构函数
  11. iframe关闭当前窗口_iframe 、 a标签、input标签
  12. ABP:在多语句事务内不允许使用 CREATE DATABASE 语句
  13. 集中火力,专项击破!数据分析可视化广深线下培训火热来袭
  14. CentOS 7.4 安装Nginx
  15. SQL获取当前时间的前10天
  16. 网站建设费用贵和便宜有什么区别?
  17. 推荐几款优质 Mac 软件下载网站 - 从此告别软件荒
  18. HDFS与HBASE的动态节点的扩容(增删)小白级(二)
  19. 用计算机做课文成音乐,用计算机音乐制作手机铃声的理论与实践.pdf
  20. vivado batch mode

热门文章

  1. MyEclipse 10(汉化版)安装教程
  2. 计算机视觉与深度学习 | 激光雷达(Lidar)发展史及其应用
  3. 北斗导航 | 监测和减轻空间天气对GNSS应用的影响
  4. php多维数组遍历创建表格,php实现遍历多维数组的方法_PHP
  5. php短信android,Android_Android短信操作常见协议和常用代码,content://sms/inbox 收件箱 conte - phpStudy...
  6. php正则重复匹配,php – 用于匹配任何长度的所有重复子串的正则表达式
  7. 深入解析windows XP/2003:内核模式和用户模式
  8. linux内核杂记(10)-进程调度(5)
  9. 分子生物学之蛋白质概述
  10. 【Python】这个插件竟打通了Python和Excel,还能自动生成代码!