一、命名空間的using指示與using宣告
1、using宣告
(1)乙個using宣告一次只引入乙個命名空間成員。
(2)using宣告的作用域為:從using宣告點開始,直到包含該using宣告的作用域的末尾,名字都是可見的。類作用域中的using宣告侷限於被定義類的基類中定義的名字。
using std::string;
using std::vector;
2、using指示(待續)
(1)using指示使得特定命名空間的所有名字可見,沒有限制。
(2)可以嘗試使用using指示編寫程式,但在使用多個庫的時候,這樣做會重新引入名字衝突的所有問題。因此,使用using指示應有所限制。
3、除了在函式或其他作用域內部,標頭檔案不應該包含using宣告或using指示。在頂級作用域包含using指示或using宣告的標頭檔案,具有將該名字注入所有包含該標頭檔案的檔案中的效果。在標頭檔案中,最好總是使用完全限定的標準庫名字,比如 std::cout 等。
注:標頭檔案中應該只定義確實必要的東西。
二、標準庫string型別
1、string物件的定義和初始化
(1)string標準庫的預設建構函式將string物件初始化為空串。
(2)程式設計時要注意區分字串字面值和string資料型別的使用。
2、string物件的讀寫
(1)可以用iostream和string標準庫,使用標準輸入輸出操作符來讀寫string物件。
cin操作符會讀取並忽略開頭所有的空白字元(空格、換行、製表符等);並讀取字元直至再次遇到空白字元,讀取終止。
int main()
(2)用getline讀取整行文字
此函式接受兩個引數:乙個輸入流物件和乙個string物件。將讀取的內容儲存到string物件,但不包括換行符。getline不忽略開頭的換行符,即便它是輸入的第乙個字元,geline也將停止讀入並返回。
int main()
3、string物件的操作
(1)string::size_type型別
這是string類型別的配套型別,通過這些型別,庫型別的使用就與機器無關。儲存string的size操作結果的變數必須為string::size_type型別。注意,不要把size的返回結果賦給乙個int變數。
string物件支援下標操作,string物件的索引變數最好也用string::size_type型別。
(2)string物件與字串字面值的連線
當進行string物件和字串字面值混合連線操作時,+操作符的左右運算元必須至少有乙個是string型別的。
string s1 = "hello";
string s2 = s1 + ", " + "world"; //ok
string s3 = "hello" + ", " + "world"; //error
對於s2和s3,依次來看每個子表示式。子表示式s1 + ", "將返回乙個新string物件。
三、標準庫vector型別
vector不是一種資料型別,而只是乙個類模板。vector和vector都是資料型別。
1、vector的定義和初始化
(1)vector物件(以及其他標準庫容器物件)的重要屬性就在於可以在執行時高效的新增元素。因此,雖然可以對給定元素個數的vector物件預先分配記憶體,但更有效的方法是先初始化乙個空vector物件,然後再動態地增加元素。
(2)若沒有指定vector中元素的初始化式,則標準庫將自行提供乙個元素初始化值進行值初始化。此值依賴於元素的資料型別。
2、vector物件的操作
(1)vector物件的下標操作。vector物件支援下標操作。但應注意:下標僅能用於獲取已經存在的元素,且通過下標操作進行賦值時,不會新增任何元素。
(2)關於vector的for迴圈常常寫成如下形式:
for(vector::size_type ix = 0; ix != ivec.size(); ++ix)
ivec[ix] = 0;
應注意兩點:
第一,優先選用 != 而不是 < 來編寫迴圈判斷條件(但當迴圈變數的步長大於1時,則應使用< 。否則可能出現無限迴圈的情況)。
第二,呼叫size成員函式而不提前儲存它返回的值,這是乙個良好的程式設計習慣。這是因為,c++中有些資料結構(比如vector)可以動態增長,迴圈可以很容易的增加新的元素。這樣的執行代價其實很小,因為像size這樣的小庫函式幾乎都定義為內聯函式。
(3)不能用cout輸出操作符直接輸出vector物件。
四、標準庫bitset型別
1、bitset物件的定義和初始化
(1)與vector類似,bitset類也是類模板。不同bitset物件的區別在於長度而不是類別。定義bitset時,需明確指出bitset含有多少位,且給出的長度必須是常量表示式。
(2)用string物件初始化bitset物件。string物件與bitset物件之間是反向轉化的。string物件最右邊字元(下標最大)用來初始化bitset物件的低階位(下標為0)。
2、bitset物件的操作
(1)bitset物件支援下標操作。但是,bitset物件的下標編號從右向左,最右邊編號為0;而string物件的下標編號從左向右,最左邊編號為0。
(2)可用cout輸出操作符輸出bitset物件中的位模式。
五、迭代器簡介
1、容器的iterator型別
(1)迭代器是一種檢查容器內元素並遍歷元素的資料型別。
(2)標準庫為每一種標準容器(包括vector)定義了相應的iterator型別,而這種型別支援(概念上的)迭代器的各種操作。但是只有少數的容器支援下標操作。
2、begin和end操作
vector::iterator iter = ivec.begin();
iter指向元素ivec[0],類似乙個指標。
由end操作返回的迭代器指向vector的「末端元素的下乙個」,指向了乙個不存在的元素。
3、自增和解引用運算
(1)解引用運算子:*。*iter = 0;
(2)迭代器的自增,是把容器中的迭代器「向前移動乙個位置」。
(3)不能對end操作返回的迭代器進行解引用或自增運算。
4、const_iterator與const迭代器
(1)使用const_iterator型別時,我們可以得到乙個迭代器,它自身的值可以改變,但不能用來改變其所指向的元素的值。可以對迭代器進行自增以及使用解引用操作符來讀取值,但不能對該元素賦值。若只需遍歷容器中的元素而無需修改他們,則可以使用const_iterator。
(2)const_iterator既可以用於const vector或非const vector。
(3)const迭代器是迭代器常量,該迭代器本身的值不能修改,即該迭代器在定義時需要初始化,而且初始化之後,就不能再指向其他元素。const迭代器幾乎沒有用。
vectornums(10);
const vector::iterator cit = nums.begin();
*cit = 1; //ok
++cit; //error
5、迭代器的算術操作
有兩種:
第一,iter + n;n的型別應為vector的size_type型別或difference_type型別。
第二,iter1 - iter2;結果為difference_type的signed型別的值。iter1和iter2都必須指向同一vector中的元素。
沒有定義兩個迭代器相加的操作:iter1 + iter2(非法)。
注意:任何改變vector長度的操作都會使已存在的迭代器失效!!比如push_back之後。
C 標準IO庫 C Primer學習筆記
頭檔案型別 iostream istream 從流中讀取 ostream 寫到流中去 iostream對流進行讀寫,從istream和ostream派生而來 fstream ifstream 從檔案中讀取,由istream派生而來 ofstream 寫到檔案中去,由ostream派生而來 fstre...
c primer學習筆記2 標準庫型別
1 string.size 的返回值型別為string size type,而不是int,不要把size的返回值賦給乙個int變數,可能溢位 實際上很多庫型別size操作的返回值型別都是size type型別,這是一種類似unsigned int的型別 同樣在進行索引時索引值也是size type型...
C Primer學習札記 標準bitset庫
一 標準庫bitset型別 標準庫提供bitset類來進行位集的處理,同其他的一些標準庫一樣,要使用bitset類就必須包含系相關標頭檔案 includeusing std bitset 二 bitset物件的定義和初始化 bitsetb b有n位,每位都為0 bitsetb u b是乙個unsig...