c++标准库 及 命名空间std
1、命名空間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樣式支持?
轉載于:https://www.cnblogs.com/renyuan/archive/2013/05/30/3108626.html
總結
以上是生活随笔為你收集整理的c++标准库 及 命名空间std的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 喜羊羊与灰太狼总共多少部,把名字列出来。
- 下一篇: 第三代试管婴儿费用多少钱