acm演算法之c++標準庫及名稱空間std

whitesorrow發表於2015-05-17

c++標準庫及 名稱空間std

名稱空間std

  C++標準中引入名稱空間的概念,是為了解決不同模組或者函式庫中相同識別符號衝突的問題。有了名稱空間的概念,識別符號就被限制在特定的範圍(函式)內,不會引起命名衝突。最典型的例子就是std名稱空間,C++標準庫中所有識別符號都包含在該名稱空間中。

  如果確信在程式中引用某個或者某些程式庫不會引起命名衝突(即庫中的識別符號不會在程式中代表其他函式名稱),那麼可以通過using操作符來簡化對程式庫中識別符號(通常時函式)的使用,例如:using namespace std;那麼就可以不用在識別符號在字首std::來使用C++標準庫庫中的函式了。

 

  <iostream>和<iostream.h>是不一樣,前者沒有字尾,實際上,在你的編譯器include資料夾裡面可以看到,二者是兩個檔案,開啟檔案就會發現,裡面的程式碼是不一樣的。字尾為.h的標頭檔案c++標準已經明確提出不支援了,早些的實現將標準庫功能定義在全域性空間裡,宣告在帶.h字尾的標頭檔案裡,c++標準為了和C區別開,也為了正確使用名稱空間,規定標頭檔案不使用字尾.h。因此,當使用<iostream.h>時,相當於在c中呼叫庫函式,使用的是全域性名稱空間,也就是早期的c++實現;當使用<iostream>的時候,該標頭檔案沒有定義全域性名稱空間,必須使用namespacestd;這樣才能正確使用cout。、

 

  C++標準程式庫中的所有識別符號都被定義於一個名為std的namespace中。由於namespace的概念,使用C++標準程式庫的任何識別符號時,可以有三種選擇:

1、直接指定識別符號。例如std::ostream而不是ostream。完整語句如下:

  std::cout << std::hex<< 3.4<< std::endl;

2、使用using關鍵字。

  using std::cout;

  using std::endl;

以上程式可以寫成

  cout << std::hex<< 3.4<< endl;

3、最方便的就是使用using namespace std;

例如:

  #include <iostream>

  #include <sstream>

  #include <string>

  using namespace std;

這樣名稱空間std內定義的所有識別符號都有效(曝光)。就好像它們被宣告為全域性變數一樣。那麼以上語句可以如下寫:

  cout << hex<< 3.4<< endl;

  因為標準庫非常的龐大,所程式設計師在選擇的類的名稱或函式名時就很有可能和標準庫中的某個名字相同。所以為了避免這種情況所造成的名字衝突,就把標準庫中的一切都被放在名字空間std中。但這又會帶來了一個新問題。無數原有的C++程式碼都依賴於使用了多年的偽標準庫中的功能,他們都是在全域性空間下的。所以就有了<iostream.h>和<iostream>等等這樣的標頭檔案,一個是為了相容以前的C++程式碼,一個是為了支援新的標準。名稱空間std封裝的是標準程式庫的名稱,標準程式庫為了和以前的標頭檔案區別,一般不加".h"。

複製程式碼

比如

#include <iostream>

using namespace std;

void main()

{

  cout<< "hello!"<< endl;

}

如果不用using namespace std;這句,那麼用如下

std::cout <<"hello!"<<std::endl;

C++標準庫

C++標準庫的所有標頭檔案都沒有副檔名。C++標準庫的內容總共在50個標準標頭檔案中定義,其中18個提供了C庫的功能。<cname>形式的標準標頭檔案【<complex>例外】其內容與ISO標準C包含的name.h標頭檔案相同,但容納了C++擴充套件的功能。在<cname>形式標準的標頭檔案中,與巨集相關的名稱在全域性作用域中定義,其他名稱在std名稱空間中宣告。在C++中還可以使用name.h形式的標準C庫標頭檔案名。

C++標準庫的內容分為10類:

C1.語言支援 C2.輸入/輸出 C3.診斷 C4.一般工具 C5.字串

C6.容器 C7.迭代器支援 C8.演算法 C9.數值操作 C10.本地化

C1 標準庫中與語言支援功能相關的標頭檔案 標頭檔案  描述 

<cstddef> 定義巨集NULL和offsetof,以及其他標準型別size_t和ptrdiff_t。與對應的標準C標頭檔案的區別是,NULL是C++空指標常量的補充定義,巨集offsetof接受結構或者聯合型別引數,只要他們沒有成員指標型別的非靜態成員即可。

<limits> 提供與基本資料型別相關的定義。例如,對於每個數值資料型別,它定義了可以表示出來的最大值和最小值以及二進位制數字的位數。

<climits> 提供與基本整數資料型別相關的C樣式定義。這些資訊的C++樣式定義在<limits>中

<cfloat> 提供與基本浮點型資料型別相關的C樣式定義。這些資訊的C++樣式定義在<limits>中

<cstdlib> 提供支援程式啟動和終止的巨集和函式。這個標頭檔案還宣告瞭許多其他雜項函式,例如搜尋和排序函式,從字串轉換為數值等函式。它與對應的標準C標頭檔案stdlib.h不同,定義了abort(void)。abort()函式還有額外的功能,它不為靜態或自動物件呼叫解構函式,也不呼叫傳給atexit()函式的函式。它還定義了exit()函式的額外功能,可以釋放靜態物件,以註冊的逆序呼叫用atexit()註冊的函式。清除並關閉所有開啟的C流,把控制權返回給主機環境。

<new> 支援動態記憶體分配

<typeinfo> 支援變數在執行期間的型別標識

<exception> 支援異常處理,這是處理程式中可能發生的錯誤的一種方式

<cstdarg> 支援接受數量可變的引數的函式。即在呼叫函式時,可以給函式傳送數量不等的資料項。它定義了巨集va_arg、va_end、va_start以及va_list型別

<csetjmp> 為C樣式的非本地跳躍提供函式。這些函式在C++中不常用

<csignal> 為中斷處理提供C樣式支援

C2 支援流輸入/輸出的標頭檔案 標頭檔案  描述 

< iostream> 支援標準流cin、cout、cerr和clog的輸入和輸出,它還支援多位元組字元標準流wcin、wcout、wcerr和wclog。

<iomanip> 提供操縱程式,允許改變流的狀態,從而改變輸出的格式。

<ios> 定義iostream的基類

<istream> 為管理輸出流快取區的輸入定義模板類

<ostream> 為管理輸出流快取區的輸出定義模板類

<sstream> 支援字串的流輸入輸出

<fstream> 支援檔案的流輸入輸出

<iosfwd> 為輸入輸出物件提供向前的宣告

<streambuf> 支援流輸入和輸出的快取

<cstdio> 為標準流提供C樣式的輸入和輸出

<cwchar> 支援多位元組字元的C樣式輸入輸出

 

C3 與診斷功能相關的標頭檔案 標頭檔案 描述

<stdexcept> 定義標準異常。異常是處理錯誤的方式

<cassert> 定義斷言巨集,用於檢查執行期間的情形

<cerrno> 支援C樣式的錯誤資訊

 

C4 定義工具函式的標頭檔案 標頭檔案 描述

<utility> 定義過載的關係運算子,簡化關係運算子的寫入,它還定義了pair型別,該型別是一種模板型別,可以儲存一對值。這些功能在庫的其他地方使用

<functional> 定義了許多函式物件型別和支援函式物件的功能,函式物件是支援operator()()函式呼叫運算子的任意物件

<memory> 給容器、管理記憶體的函式和auto_ptr模板類定義標準記憶體分配器

<ctime> 支援系統時鐘函式

 

C5 支援字串處理的標頭檔案 標頭檔案 描述

<string> 為字串型別提供支援和定義,包括單位元組字串(由char組成)的string和多位元組字串(由wchar_t組成)

<cctype> 單位元組字元類別

<cwctype> 多位元組字元類別

<cstring> 為處理非空位元組序列和記憶體塊提供函式。這不同於對應的標準C庫標頭檔案,幾個C樣式字串的一般C庫函式被返回值為const和非const的函式對替代了

<cwchar> 為處理、執行I/O和轉換多位元組字元序列提供函式,這不同於對應的標準C庫標頭檔案,幾個多位元組C樣式字串操作的一般C庫函式被返回值為const和非const的函式對替代了。

<cstdlib> 為把單位元組字串轉換為數值、在多位元組字元和多位元組字串之間轉換提供函式

 

C6 定義容器類的模板的標頭檔案 標頭檔案 描述

<vector> 定義vector序列模板,這是一個大小可以重新設定的陣列型別,比普通陣列更安全、更靈活

<list> 定義list序列模板,這是一個序列的連結串列,常常在任意位置插入和刪除元素

<deque> 定義deque序列模板,支援在開始和結尾的高效插入和刪除操作

<queue> 為佇列(先進先出)資料結構定義序列介面卡queue和priority_queue

<stack> 為堆疊(後進先出)資料結構定義序列介面卡stack

<map> map是一個關聯容器型別,允許根據鍵值是唯一的,且按照升序儲存。multimap類似於map,但鍵不是唯一的。

<set> set是一個關聯容器型別,用於以升序方式儲存唯一值。multiset類似於set,但是值不必是唯一的。

<bitset> 為固定長度的位序列定義bitset模板,它可以看作固定長度的緊湊型bool陣列

 

C7 支援迭代器的標頭檔案 標頭檔案 描述

<iterator> 給迭代器提供定義和支援

 

C8 有關演算法的標頭檔案 標頭檔案 描述

<algorithm> 提供一組基於演算法的函式,包括置換、排序、合併和搜尋

<cstdlib> 宣告C標準庫函式bsearch()和qsort(),進行搜尋和排序

<ciso646> 允許在程式碼中使用and代替&&

 

C9 有關數值操作的標頭檔案 標頭檔案 描述

<complex> 支援複雜數值的定義和操作

<valarray> 支援數值向量的操作

<numeric> 在數值序列上定義一組一般數學操作,例如accumulate和inner_product

<cmath> 這是C數學庫,其中還附加了過載函式,以支援C++約定

<cstdlib> 提供的函式可以提取整數的絕對值,對整數進行取餘數操作

 

C10 有關本地化的標頭檔案 標頭檔案 描述

<locale> 提供的本地化包括字元類別、排序序列以及貨幣和日期表示。

<clocale> 對本地化提供C樣式支援

相關文章