C++11 中STL库中新增内容
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基本上就是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库中新增内容的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CSDN好多原创翻译的文章
- 下一篇: SDWebImage详解