1. 程式人生 > >[C/C++] C/C++延伸學習系列之STL及Boost庫概述

[C/C++] C/C++延伸學習系列之STL及Boost庫概述

  想要徹底搞懂C++是很難的,或許是不太現實的。但是不積矽步,無以至千里,所以抽時間來堅持學習一點,總結一點,多多鍛鍊幾次,相信總有一天我們會變得"瞭解"C++。

1. C++標準庫——STL

1.1 STL簡介

  STL(Standard Template Library,標準模板庫)是惠普實驗室開發的一系列軟體的統稱。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普實驗室工作時所開發出來的。

  STL的程式碼從廣義上講分為三類:algorithm(演算法)、container(容器)和iterator(迭代器),幾乎所有的程式碼都採用了模板類和模版函式的方式,這相比於傳統的由函式和類組成的庫來說提供了更好的程式碼重用機會。

  在C++標準中,STL被組織為下面的13個頭檔案<algorithm>、<deque>、<functional>、<iterator>、<vector>、<list>、<map>、<memory>、<numeric>、<queue>、<set>、<stack>和<utility>

2.1 演算法

  大家都能取得的一個共識是函式庫對資料型別的選擇對其可重用性起著至關重要的作用。舉例來說,一個求方根的函式,在使用浮點數作為其引數型別的情況下的可重用性肯定比使用整型作為它的引數類性要高。而C++通過模板的機制允許推遲對某些型別的選擇,直到真正想使用模板或者說對模板進行特化的時候,STL就利用了這一點提供了相當多的有用演算法。它是在一個有效的框架中完成這些演算法的——你可以將所有的型別劃分為少數的幾類,然後就可以在模版的引數中使用一種型別替換掉同一種類中的其他型別。

  STL提供了大約100個實現演算法的模版函式,比如演算法for_each將為指定序列中的每一個元素呼叫指定的函式,stable_sort以你所指定的規則對序列進行穩定性排序等等。這樣一來,只要我們熟悉了STL之後,許多程式碼可以被大大的化簡,只需要通過呼叫一兩個演算法模板,就可以完成所需要的功能並大大地提升效率。

  演算法部分主要由標頭檔案<algorithm>,<numeric>和<functional>組成。

  <algorithm>是所有STL標頭檔案中最大的一個(儘管它很好理解),它是由一大堆模版函式組成的,可以認為每個函式在很大程度上都是獨立的,其中常用到的功能範圍涉及到比較、交換、查詢、遍歷操作、複製、修改、移除、反轉、排序、合併等等。

  <numeric>體積很小,只包括幾個在序列上面進行簡單數學運算的模板函式,包括加法和乘法在序列上的一些操作。

  <functional>中則定義了一些模板類,用以宣告函式物件。

2.2 容器

  在實際的開發過程中,資料結構本身的重要性不會遜於操作於資料結構的演算法的重要性,當程式中存在著對時間要求很高的部分時,資料結構的選擇就顯得更加重要。經典的資料結構數量有限,但是我們常常重複著一些為了實現向量、連結串列等結構而編寫的程式碼,這些程式碼都十分相似,只是為了適應不同資料的變化而在細節上有所出入。STL容器就為我們提供了這樣的方便,它允許我們重複利用已有的實現構造自己的特定型別下的資料結構,通過設定一些模版類,STL容器對最常用的資料結構提供了支援,這些模板的引數允許我們指定容器中元素的資料型別,可以將我們許多重複而乏味的工作簡化。

  容器部分主要由標頭檔案<vector>,<list>,<deque>,<set>,<map>,<stack>和<queue>組成。對於常用的一些容器和容器介面卡(可以看作由其它容器實現的容器),可以通過下表總結一下它們和相應標頭檔案的對應關係。

向量(vector) 連續儲存的元素<vector>
列表(list) 由節點組成的雙向連結串列,每個結點包含著一個元素<list>
雙佇列(deque)  連續儲存的指向不同元素的指標所組成的陣列<deque>
集合(set)  由節點組成的紅黑樹,每個節點都包含著一個元素,節點之間以某種作用於元素對的謂詞排列,沒有兩個不同的元素能夠擁有相同的次序 <set>
多重集合(multiset)  允許存在兩個次序相等的元素的集合 <set>
棧(stack)  後進先出的值的排列 <stack>
佇列(queue)  先進先出的執的排列 <queue>
優先佇列(priority_queue)  元素的次序是由作用於所儲存的值對上的某種謂詞決定的的一種佇列 <queue>
對映(map)  由{鍵,值}對組成的集合,以某種作用於鍵對上的謂詞排列 <map>
多重對映(multimap)  允許鍵對有相等的次序的對映 <map>

2.3 迭代器

   下面要說的迭代器從作用上來說是最基本的部分,可是理解起來比前兩者都要費力一些(至少筆者是這樣)。軟體設計有一個基本原則,所有的問題都可以通過引進一個間接層來

簡化,這種簡化在STL中就是用迭代器來完成的。

  概括來說,迭代器在STL中用來將演算法和容器聯絡起來,起著一種黏和劑的作用。幾乎STL提供的所有演算法都是通過迭代器存取元素序列進行工作的,每一個容器都定義了其本身所專有的迭代器,用以存取容器中的元素。

   迭代器部分主要由標頭檔案<utility>,<iterator>和<memory>組成。

  <utility>是一個很小的標頭檔案,它包括了貫穿使用在STL中的幾個模板的宣告,

  <iterator>中提供了迭代器使用的許多方法,而對於<memory>的描述則十分的困難,它以不同尋常的方式為容器中的元素分配儲存空間,同時也為某些演算法執行期間產生的臨時物件提供機制。

  <memory>中的主要部分是模板類allocator,它負責產生所有容器中的預設分配器。

  對於STL的使用,普遍存在著兩種觀點。第一種認為STL的最大作用在於充當經典的資料結構和演算法教材,因為它的原始碼涉及了許多具體實現方面的問題。第二種則認為STL的初衷乃是為了簡化設計,避免重複勞動,提高程式設計效率,因此應該是“應用至上”的,對於原始碼則不必深究。筆者則認為分析原始碼和應用並不矛盾,通過分析原始碼也能提高我們對其應用的理解,當然根據具體的目的也可以有不同的側重。

2. C++“準”標準庫——Boost

  Boost 庫通過加入一些在實踐中非常有用的函式對 C++ 標準進行了補充。 由於 Boost C++ 庫是基於 C++ 標準的,所以它們是使用最先進的 C++ 來實現的。 它們是平臺獨立的,並由於有一個大型的開發人員社群,它可以被包括 Windows 和 Linux 在內的許多作業系統所支援。 Boost庫由C++標準委員會庫工作組成員發起,其中有些內容有望成為下一代C++標準庫內容。在C++社群中影響甚大,是不折不扣的“準”標準庫。Boost由於其對跨平臺的強調,對標準C++的強調,與編寫平臺無關。大部分boost庫功能的使用只需包括相應標頭檔案即可,少數(如正則表示式庫,檔案系統庫等)需要連結庫。可以說,Boost庫是為C++語言標準庫提供擴充套件的一些C++程式庫的總稱。

  Boost C++ 庫可以提升一個 C++ 開發人員的生產力。 例如,你可以從智慧指標中受益,幫助你寫出更可靠的程式碼,或者使用某個庫來開發平臺獨立的網路應用。但Boost中也有很多是實驗性質的東西,在實際的開發中實用需要謹慎。

  由於博主也屬於boost方面的菜鳥,對boost瞭解也很有限,這裡就不多介紹了,希望可以和大家一起“快樂”的學習和交流C++的知識。boost的官方網站:http://www.boost.org/

相關推薦

[C/C++] C/C++延伸學習系列STLBoost概述

  想要徹底搞懂C++是很難的,或許是不太現實的。但是不積矽步,無以至千里,所以抽時間來堅持學習一點,總結一點,多多鍛鍊幾次,相信總有一天我們會變得"瞭解"C++。 1. C++標準庫——STL 1.1 STL簡介   STL(Standard Template Library,標準模板庫)是惠普實驗室

c#學習系列委托與事件

gen () 第一次用 關鍵字 將在 generic frame 再次 body 1. 引言 委托 和 事件在 .Net Framework中的應用非常廣泛,然而,較好地理解委托和事件對很多接觸C#時間不長的人來說並不容易。它們就像是一道檻兒,過了這個檻的人,覺得真是太容易

c#學習系列反射

pro under 還要 語句 寫入 size turn 循環 新建 前期準備 在VS2012中新建一個控制臺應用程序(我的命名是ReflectionStudy),這個項目是基於.net 4.0。接著我們打開Program.cs文件,按照如下在Program中寫一個我

C++ 學習筆記——STL queue

1. 佇列 queue 佇列是一種容器介面卡,專門用來滿足先進先出的操作,也就是元素在容器的一端插入並從另一端提取。 bool empty() const; 返回佇列是否為空; size_type size() const; 返回佇列中元素的數量; reference& back()

C# WinForm控制元件美化擴充套件系列ImageComboBox_C# 視角_CS程式設計師

(1)美化下拉按鈕和邊框,前面的文章已經實現。 (2)當ComboBox沒有控制元件選擇項和沒有焦點時顯示提示使用者操作資訊,前面的也文章已經實現。 (3)在下拉列表框的項中顯示圖示,項可以縮排。 (4)在ComboBox控制元件中也顯示圖示。 來看看最終需要

C# MVC 微信支付教程系列公眾號支付程式碼

今天,我們接著講微信支付的系列教程,前面,我們講了這個微信紅包和掃碼支付。現在,我們講講這個公眾號支付。公眾號支付的應用環境常見的使用者通過公眾號,然後再通過公眾號裡面的菜單鏈接,進入公眾號的商城,然後在裡面完成購買和支付功能,我們可以看看官方對這個公眾號支付的場景的解釋,連

Objective-C如何使用物件集合學習系列

c ) OBJECT AT INDEX 1 EXCHANGED WITH OBJECT AT INDEX 2 IN ARRAY: ( B,A,a,c ) OBJECT 'A' REMOVED IN ARRAY: ( B,a,c ) OBJECT AT INDEX 1 REM

C++ 學習筆記——STL vector

vector 是一種順序容器,可以看作是可以改變大小的陣列。 就像陣列一樣,vector 佔用連續的記憶體地址來儲存元素,因此可以像陣列一樣用偏移量來隨機訪問,但是它的大小可以動態改變,容器會自動處理記憶體分配問題。 在內部,vector 使用動態分配的陣列來儲存元

CSS3學習系列選擇器(二)

計算 選擇器 sky :focus ddr gree for 指定元素 學習 first-child選擇器和last-child選擇器 first-child指定第一個元素。last-child指定最後一個子元素。 例如: <!DOCTYPE html>

CSS3學習系列動畫

html city 相同 方法 pos 另一個 過渡 doctype yellow Transitions功能使用方法 在css3中,transitions功能通過將元素的某個屬性從一個屬性值在指定的時間內平滑過渡到另一個屬性值來實現動畫功能,可通過transition

hadoop入門學習系列六hadoop學習sqoop安裝

1.7 sqoop安裝 opc 2.6 clas jdb -m -- error 1.下載安裝包及解壓 tar -zxvf sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz 2.配置環境變量和配置文件 cd 到 sqoop

Python零基礎學習系列二--Python介紹環境搭建

url 軟件包 三方庫 簡單的 lin 文件的 span 高級程序設計 擴展 1-1、Python簡介:  Python是一種解釋型、面向對象、動態數據類型的高級程序設計語言。Python由Guido van Rossum於1989年底發明,第一個公開發行版發行於1991年

SaltStack學習系列state常用模塊

local dir 工作 用戶 函數 bash ash 文本 use 常用模塊:cron,cmd,file,mount,ntp,pkg,service,user,group cmd模塊 參數: name:要執行的命令 unless:用於檢查的命令,只有unless指向的命令

SaltStack學習系列Nginx部署

param log fix ack color col blog 系列 部署 目錄結構 |-- nginx | |-- files #放包文件的 | | |-- admin_22.conf | | |-- fastcgi_params

SaltStack學習系列State安裝Nginx+PHP環境

目錄結構 logs pkg lease .rpm mes cto -1 eal 目錄結構 |-- pillar | |-- nginx | | `-- nginx.sls #nginx變量(key:value) | `-- top.sls `-- sa

學習系列數據類型

如果 技術 底層 object類 數字交換 包含 int32 對象賦值 處理 一、數據類型初探 電腦是由什麽來存儲所使用的數據? 這個問題用一句話比較籠統的概括,那就是:電腦使用內存來記憶計算時所使用的數據。在現實生活中的數據各種各樣,整數、小數、字符串、字符等等

Java命令學習系列jmap

.com respond 標識 config 一個bug running vivo huang 父類 jmap是JDK自帶的工具軟件,主要用於打印指定Java進程(或核心文件、遠程調試服務器)的共享對象內存映射或堆內存細節。可以使用jmap生成Heap Dump。 什麽

Java命令學習系列jstack

數據庫 get image for 線程調度 nbsp 額外 無限 其他 jstack是java虛擬機自帶的一種堆棧跟蹤工具。 功能 jstack用於生成java虛擬機當前時刻的線程快照。線程快照是當前java虛擬機內每一條線程正在執行的方法堆棧的集合,生成線程快照的主

Django學習系列captcha 驗證碼插件

應用 自動 sta 前端 流程 bsp msg char erro 安裝部署 安裝captcha pip3.6 install django-simple-captcha==0.4.6 settings.py中引入captcha INSTALLED_APPS = [

大數據學習系列五 ----- Hive整合HBase圖文詳解

scala direct ont 增加 pac hadoop2 exe dfs- min 引言 在上一篇 大數據學習系列之四 ----- Hadoop+Hive環境搭建圖文詳解(單機) 和之前的大數據學習系列之二 ----- HBase環境搭建(單機) 中成功搭建了Hive