C++11 中STL库新增内容
来源:互联网 发布:最尴尬的事情 知乎 编辑:程序博客网 时间:2024/06/06 17:23
转自:http://www.cnblogs.com/TianFang/archive/2013/01/25/2876400.html
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要简单得多。
容器
容器方面主要加了如下几个:
- tuple
- array
- 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库新增内容
- C++11 中STL库中新增内容
- C++11 中STL库中新增内容
- C++11 中STL库中新增内容
- jQuery中对新增内容绑定事件
- c++stl中reverse
- c++stl中reverse
- c++11 新增内容每日学习笔记
- gdb中查看stl容器内容
- gdb 查看c++中stl的内容
- 详解CSS3中新增的内容属性:content
- C# 3.0 新增内容
- CSS3新增内容
- HTML5新增内容
- 【c++——STL】标准模板库STL中优先队列Priority Queues使用手册
- dom4j解析xml文件,添加新节点,添加节点内容,读取文件中节点内容作为新增节点内容
- C与C++比较新增功能大全(完善中)
- STL标准容器中内容的几种打印技巧
- Delphi-- 如何设置程序开机运行(写注册表)
- seekbar 自定义样式
- 一步一步深入 Linq to SQL
- Java ==和equals的区别 栈与堆的概念 放到一起就容易理解了
- spring mvc记录
- C++11 中STL库新增内容
- WCF----取消集成windows身份验证 IIS仍无权查看网页
- java httpServletResponse返回流进行 下载
- SecureCrt
- 坑爹的stl
- Handler(2)
- Mac OS X下如何使用OpenGL
- 使用ASP.NET模板生成HTML静态页面
- Java基础----equals