1. 程式人生 > >C++11 中STL庫中新增內容

C++11 中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_ptrweak_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庫中:

  • 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新增內容

引用包裝器(Reference Wrapper) 當模板函式引數為泛型型別的時候,無法推匯出是傳值還是傳引用,預設情況下會使用傳值的方式。這是我們可以用std::ref顯式指定以傳引用的方式例項化模板函式。     #include <functional>

queue (C++STL常用queue基本用法的實現) ([連結串列],[陣列]的實現)

Queue: 依循先進先出的規則的單調佇列. 下面是用連結串列實現的queue的幾個基本用法和一個clear()的補充用法: #include<stdio.h> /* *Date:2018/10/22 *Author:Fushicho *Name:queue連

STL的集合set簡介(C++,Java)

1.簡介: 集合是數學中的一個概念,通俗地理解,集合是由一些不重複的資料組成的。比如{1,2,3}就是一個有1,2,3三個元素的集合。C++和Jav的標準庫中的集合支援高效的插入、刪除和查詢操作,這3個操作的時間複雜度都是O(lgn),其中n是當前集合中元素的個數。如果用陣

c++STL 簡介 及 使用說明

作為C++標準不可缺少的一部分,STL應該是滲透在C++程式的角角落落裡的。STL不是實驗室裡的寵兒,也不是程式設計師桌上的擺設,她的激動人心並非曇花一現。本教程旨在傳播和普及STL的基礎知識,若能借此機會為STL的推廣做些力所能及的事情,到也是件讓人愉快的事情。    初識STL:解答一些疑問    1.1

stack (C++STL常用stack基本用法的實現) ([連結串列],[陣列]的實現)

Stack:依循先進後出原則的單調佇列. 下面是用連結串列實現的stack的幾個基本用法和一個clear()的補充用法: #include<stdio.h> /* *Date:2018/

C++11 學習 間隔更新

返回值 聲明變量 常量 指針 用法 地址 拷貝 構造函數 意見 1、*this 返回執行它的的對象的引用,this返回的是地址,這涉及C++對象模式有可能是對象的首地址,有可能是首地址加上虛表的長度, 一般是*this ,有不同意見的可以提出來討論 2、初始化列表的應用

sort在STL是排序函數

operator 相等 bool 降序排序 string 數列 lin keyword compare sort在STL庫中是排序函數,有時冒泡、選擇等O(N^2)算法會超時時,我們可以使用STL中的快速排序O(N log N)完成排序 sort在<algorithm

泛型程式設計學習,編寫一個類似STL的簡易list的迭代器(iterator)

泛型程式設計學習,編寫一個類似STL庫中的簡易list的迭代器(iterator) 前言 近期在研究stl原始碼及stl裡各種實現的細節,初學入門免不了模仿,以下便寫一次自己的簡單的list容器的迭代器。 首先,在開始編寫List的迭代器的時候我們首先應該瞭解我們要寫的List和其迭

C語言常用函式函式

1.pow(x,y);求x的y次方; 2.strstr(str1,str2);判斷str2是否為str1的子串,若是返回首次出現的位置,若不是返回NULL; 3.strcat(char* dest, const char *src);字串剪接函式,將src接

C++11::遍歷tuple的元素

轉自:https://blog.csdn.net/lanchunhui/article/details/49868077 在設計tuple的遍歷程式之前,我們不妨先進行std::pair的列印工作: // #include <utility> cout << make

c++11多執行緒的互斥量

寫在前面 在多執行緒程式中互斥量的概念十分重要,要保護執行緒之間的共享資料,互斥量的lock、unlock、try_lock函式,以及類模板lock_guard、unique_lock十分重要 栗子 首先先看一下,沒有再共享資料上做任何保護的程式: #include <iost

C語言string.h的常用函式

memmove用於從src拷貝count個位元組到dest,如果目標區域和源區域有重疊的話,memmove能夠保證源串在被覆蓋之前將重疊區域的位元組拷貝到目標區域中。但複製後src內容會被更改。但是當目標區域與源區域沒有重疊則和memcpy函式功能相同。

STL的stack和queue及其模擬實現

在學完了list和vector之後,緊接著就是與其相關聯的兩個資料結構棧(stack)和佇列(queue)。棧的特點是先進後出,即先進棧的元素後出棧;佇列的特點是後進先出,即先入佇列的元素先出佇列。 棧只允許在棧頂插入和刪除資料,其基本結構如下 佇列只允

C# 呼叫 C++ dll 動態連結多個函式時全域性變數的問題

    最近編寫C#程式呼叫C++語言的演算法庫,自己嘗試在C++中封裝好DLL庫,並在一個工程檔案中同時匯出多個函式供C#呼叫。多個函式之間需要相互通訊,但又不能互相呼叫,,一個很好的方法就是用全域

VS2015及VS2017組合語言呼叫C語言的stdio的函式

眾所周知,VS可以用來寫組合語言,同樣的在組合語言中,我們可以呼叫C語言中的函式,前提我們需要知道呼叫的函式在哪裡。例如下面這一段程式碼:;//VS15/17 Template for Win32 Console Application.686.MODEL flat, std

如何讓釋出的C#的DLL類的方法帶有註釋說明

一個類庫讓第三方引用時,預設情況下生成類庫時不攜帶註釋,所以別人引用這個類庫時就不是很方便理解類方法的作用和每個引數的含義,若是能攜帶方法的說明註釋就好了。 具體設定是   專案---屬性-生成,將“XML文件檔案”選中即可。

c++11多執行緒的condition_variable(生產者消費者示例)

#include <iostream> #include <string> #include <th

C++11 std::chrono詳解

toolbar space max mil exp 值類型 cond 精度 ++i 所謂的詳解只不過是參考www.cplusplus.com的說明整理了一下,因為沒發現別人有詳細講解。   chrono是一個time library, 源於boost,現在已經是C++標準。

Python2和Python3urlliburlencode的使用注意事項

前言 在Python中,我們通常使用urllib中的urlencode方法將字典編碼,用於提交資料給url等操作,但是在Python2和Python3中urllib模組中所提供的urlencode

C++獲得時間戳 C++11的chrono

steady_clock::duration d = steady_clock::now().time_since_epoch(); minutes min = duration_cast<minutes>(d); seconds sec = duratio