C++11 中STL庫中新增內容

來源:互聯網
上載者:User

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,以提供更高的查詢效能。使用方式和原來二叉樹版的也大同小異,這裡就不多介紹了。

Regex

Boost的regex庫也終於標準化了,要使用字串處理的可以不用到處找第三方的Regex庫了。不過目前VC還不支援像C#那樣取消逸出字元(gcc可以),在代碼裡面的Regex依然非常難讀,希望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庫。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.