1. 程式人生 > >C++11的新功能特性對Boost庫影響

C++11的新功能特性對Boost庫影響

《Boost程式庫探祕——深度解析C++準標準庫》之試讀

        前一陣子還看到一篇文章,說C#要重蹈C++的覆轍,這裡說的C++的覆轍是什麼呢?是指C++語言過於臃腫的功能特性,導致學習人員的流失。文章說,語言最後的威力是“開發軟體”,而不是“比拼新特性”

       在大學中,C++算是比較難學的語言。有些學校試圖直接讓學生們學習C++,結果效果不怎麼好。這次,C++11又添加了大量新特性,如lambda,auto等,把C++弄的像動態語言一樣。

       添加了那麼多新特性,而為了照顧使用者的習慣和已有的程式碼。又不能去除一些舊的特性,這樣導致了C++越來越臃腫和複雜。記得在哪裡看過,好像是塞伯斯塔的程式設計語言一書中說的吧:程式語言發展的一個重要的特性就是易學性。而語言的簡潔程度在很大程度上影響了語言的易學性。況且在不拋棄老的特性的情況下,又添加了新的特性。會大大增加語言的學習成本。

       令人奇怪的是,C++Primer英文版第五版有1225頁,而包含C++11的第六版C++Primer一書仍然只有1200頁。並沒有增加,反而減少了25頁(第六版的C++Primer我沒有讀,不能評價其內容)。在未來,簡潔且同樣高效的類C語言——Go語言或許會對臃腫的C++發起挑戰。

       當然,這只是我的看法,現在還說不清這種大雜燴會對C++的未來產生什麼影響。

       閱讀C++的程式碼,一直是一件痛苦的事,尤其是STL相關的。C++11的一些新特性,讓C++程式碼的可讀性大大增強。如自動型別推導auto,這在基本型別的使用時還沒發現其優點,但是在使用模板時,auto就可以大大簡化程式碼。引用一個例子:vector<int>::const_iteratorci = vi.begin();,在引入auto後,就可以簡化成auto ci = vi.begin();

       此外,還有一些其他的特性值得關注,這裡就先不一一細數了。

       這本書是關於Boost庫的,C++11的出現,勢必會對Boost現有的一些庫產生影響。為了方便大家,下面就列出一些C++11對Boost庫的影響列表(這個列表是網上收集整理翻譯來的,可能不準確或不全,請大家見諒):
原Boost庫 C++11新的特性或庫
BOOST_FOREACH 基於Rangefor迴圈替代。(序列for迴圈,有點像Pythonfor迴圈了)
Functional/Forward 新的標準庫std::forward
BOOST_Lambda Lambda表示式
Min-Max 新的標準庫std::min|max、std::minmax_element
Move 右值引用
Ratio 新的標準庫std::ratio
StaticAssert static_assert
Thread <thread>
Typeof auto, decltype,推斷變數或表示式的資料型別
Valueinitialized List-initialization
Array 新的標準庫std::array
Bind 新的標準庫std::bind
EnableIf 新的標準庫std::enable_if
Function 新的標準庫std::function
MemberFunction 新的標準庫std::mem_fn
Random <random>
Ref 新的標準庫std::ref、std::cref
Regex C++11regex
ResultOf 新的標準庫std::result_of
SmartPtr 新的標準庫std::unique_ptr、std::shared_ptr、std::weak_ptr
Swap(swapping arrays) 新的標準庫std::swap
Tuple 新的標準庫std::tuple
TypeTraits <type_traits>
Unordered <unordered_set>、<unordered_map>
         Boost庫是非常強大的,但對初學者(這裡的初學者並不是真正意義上的C++語言初學者,而是已經瞭解C++基本語法的初學者)來說,當務之急是瞭解C++11的標準庫內容。能用標準庫的,儘量用標準庫。在熟練以後,使用這本書去查詢自己需要的庫。不要一頭扎進Boost的海洋,那樣會讓人迷茫而打退堂鼓。

通過閱讀本書的樣章,會發現這是一本參考書。看到這裡,讀者或許會說,這不是廢話嗎,我也知道這是參考書。但我真遇到一些人,將這一類書拿來當教科書使用。或許真有這樣的人適合這種學習方法的。不過我建議大家還是把這本書作為電腦旁的參考書使用。您會發現,這本書將在你需要的時候節省您寶貴的時間。

本書實際上是作者寫的第二版介紹Boost庫的書。所以在樣章中介紹的Boost庫內容,已經考慮到了C++11的新特性,如在第四章介紹hash時,書中提到了C++TR1草案。昨天的TR1草案,大部分已經變成現在的C++11的特性。所以使用本書,不必擔心本書是否“過時”的問題。

羅馬不是一天建成的,Boost庫也不是一兩個月可以瞭解清楚的。相信在這本書的幫助下,再加上平時的實踐,您對Boost庫會有一個更深刻的瞭解。


相關推薦

C++11功能特性Boost影響

《Boost程式庫探祕——深度解析C++準標準庫》之試讀         前一陣子還看到一篇文章,說C#要重蹈C++的覆轍,這裡說的C++的覆轍是什麼呢?是指C++語言過於臃腫的功能特性,導致學習人員的流失。文章說,語言最後的威力是“開發軟體”,而不是“比拼新特性”    

自從昨天我發現VS2012可以編譯出支援XP的程式碼之後,我決定在GacUI裡面全面使用C++11功能

昨天研究發現,只要安裝了Update 1的Visual Studio 2012也可以編譯出支援XP的程式了。為了讓GacUI可以順利執行在XP上(雖然現在因為兩個api還不能),我一直試圖讓GacUI相容VS2010。VS2010對lambda的支援的bug很多,所以導致GacUI無法全面使用C+

c++11特性總結和boost的使用

來自<<深入理解c++11 c++11新特性解析與應用>> 程式碼見:https://github.com/Jeromecen/cpp11study/tree/master I、保持語言的穩定性和相容性” 總結:主要是utf8字串,虛擬函式o

C++11特性,bind,基於

實體 oca jci con data () ebr mrp ddd body, table{font-family: 微軟雅黑; font-size: 10pt} table{border-co

C++11特性(84)-標準mem_fn類模板

定製演算法 演算法是C++標準庫中非常重要的部分,C++通過演算法+容器的方式將資料結構和演算法進行了分離。這樣做的好處就是使使用者獲得最大限度的靈活性。   例如下面的Tracer類。 我們可以非常方便的定義儲存Tracer物件的資料結構:  

C++11特性(75)-隨機數(Random Number Library)

從前的隨機數 C++11之前,無論是C,還是C++都使用相同方式的來生成隨機數,程式碼大致如下: 由於rand()產生的是偽隨機數,所以需要為rand函式提供種子。種子不同產生的隨機數序列也不同。通常的做法是呼叫srand(time(0)),由於time返回的是系統時間,每秒都會不

C++11特性(74)-正則表示式(regular-expression library)

正則表示式(regular expression)是一種描述字元序列的方法,從C++11起,C++正則表示式庫(regular-expression library)成為新標準庫的一部分。 由於正則表示式本身就是一個非常龐大的系統,本文只介紹C++中使用正則表示式的小例子,淺嘗輒止。 基

C++11特性11)- 標準函式begin和end

遍歷陣列元素的方法假設有一個數組:inta1[]{1,2,3,4,5};遍歷陣列的所有元素,可以這樣:for(unsignedinti=0;i<sizeof(a1)/sizeof(a1[0]);++i){cout<<a1[i]<<endl;}也可

C++11特性應用--介紹幾個新增的便利算法(用於排序的幾個算法)

uil pretty processor nes container 升序 .text mar c++11 繼續C++11在頭文件algorithm中添加的算法。 至少我認為,在stl的算法中,用到最多的就是sort了,我們不去探索sort的源代碼。就

C++11特性之 std::forward(完美轉發)(轉)

tails array sin .com std utili res details calling 我們也要時刻清醒,有時候右值會轉為左值,左值會轉為右值。 (也許“轉換”二字用的不是很準確) 如果我們要避免這種轉換呢? 我們需要一種方法能按照參數原來的類型轉發到另一個函

C++11特性——lambda表達式

amp 多個 str exp href 似的 exception 定義 參數傳遞 C++11的一大亮點就是引入了Lambda表達式。利用Lambda表達式,可以方便的定義和創建匿名函數。對於C++這門語言來說來說,“Lambda表達式”或“匿名函數”這些概念聽起來好像很深奧

C++11特性(87)-專題文章彙總

寫在最後   本連載從去年10月29日開始,到今天就全部結束了。為了方便各位讀者更加方便地利用這些文章,特將本連載的文章連結彙總到一個檔案中。歡迎大家多加利用。   歡迎大家繼續關注本公眾號!   文章下載連結: https://down

C++11特性(86)-類型別的union成員(2)

經過一番準備,我們進入正題。   類型別的union成員 C++的早期版本不允許union的成員是定義了建構函式或拷貝控制成員的類型別成員,C++11中取消了這個限制。但是也別高興得太早,因為這類union在發生涉及到類型別成員的值轉換時需要根據需求呼叫相關類成員的建構函式

C++11特性(85)-類型別的union成員(1)

接下來的兩篇文章介紹C++11的最後一個新特性:類型別的union成員。這個新特性涉及的內容較多,所以本文先做一些不屬於C++11新特性的準備工作。   匿名union 我們通過一個例子類說明。假設有以下函式: 這 個函式的功能是根據引數rt的要求產生隨機數

C++11特性(83)-enum前置宣告

大型開發都會遇到的問題 隨著軟體規模的擴大,包含在一個工程中的模組的數量在不斷增長,模組之間的依賴關係也日益複雜。這裡只舉一個相對簡單的例子:一個包含2個類,5個檔案的工程。 ImportantClass.h 標頭檔案中聲明瞭建構函式,doWork成員函式和資料成員buffer

C++11特性(82)-指定enum型別的大小

enum型別有多大? 這並不是一個簡單的問題,需要分情況討論。   沒有指定作用域的情況 列舉型別的大小會隨著列舉值的範圍自動調整。例如下面的程式碼: enum_1只有兩個列舉值,它的大小就是4個位元組;enum_2的第一個列舉值指定了一個超過32位的數,所以

C++11特性(81)-有作用域的enum(scoped enumeration)

列舉型別的困惑 從C語言過度到C++以後,列舉作為減少程式錯誤的手段之一被廣泛地使用。但是同時也帶來一個問題:列舉值的重複。假設我們有下面的三原色定義: 程式碼中同時也需要定義三基色: 二者同時定義之後,就會遇到一個問題:red和blue連個值都被重複定義。 &nbs

C++11特性(80)-繼承的建構函式與多重繼承

複習 本文算是前面文章的繼續。 對於繼承的建構函式,C++11通過一個簡單的using語句,使得繼承一個類時可以省去一些麻煩。具體可以參照下面的文章。 C++11新特性(59)-繼承的建構函式 https://mp.weixin.qq.com/s/BGUa7-RSCtFRnBYj

C++11特性(79)-內聯名稱空間(inline namespace)

名稱空間簡介 隨著軟體開發規模的擴大,類名,函式名重複的可能性也越來越大。最樸素的解決辦法就是改名,這種方法在向已經存在的類庫中新增程式碼時問題不大,但是如果是將兩個從未謀面的程式碼庫結合在一起時就不再適用了。 C++解決這個問題的辦法就是引入名稱空間。假設有下面兩個名稱空間:

C++11特性(78)-noexcept運算子(noexcept operator)

前一篇文章說明了noexcept說明符,使用了該說明符就相當於對程式設計師和編譯器雙方承諾不會丟擲異常。程式設計師看到這個承諾,可以不必編寫複雜的異常捕捉程式碼;編譯器看到這個承諾,可以執行某些可能丟擲異常時無法進行的優化操作。 異常符說明的實參 前一篇文章沒有提到,實際上noexcep