string 和 vector 初探

標準庫類型 string

        string 表示可變長的字符序列。是C++標準庫類型的一部分,擁有不少優秀的性能。數組

        定義 string 對象時如未人爲初始化編譯器會默認初始化爲空字符串。函數

        string 對象的初始化有很是多種。大致分爲兩類:拷貝初始化直接初始化post

所有用等號(=)的初始化都爲拷貝初始化。相反不是等號則爲直接初始化。性能

當初始值僅僅有一個時,拷貝和直接初始化均可,但需要用到多個值的時候,通常來講僅僅能使用直接初始化。spa

 建議儘可能使用直接初始化。code

string s1;//默認初始化爲空串
string s2=s1;//拷貝初始化,s2是s1的副本
string s3(n,"c");//直接初始化,s3爲連續n個c構成的字符串


 

        在讀取 string 對象時,string 對象會本身主動忽略開頭的空白空格。製表符,運行符等)並從第一個真正的字符開始讀取直到碰見下一個空白爲止。對象

        getline 函數可以讀取一整行包含字符串中的空白。getline函數的參數是一個輸入流和一個 string 對象。將輸入流中讀取的一行字符串存入 string 對象中。當 getline 遇到轉行符時就結束並返回結果(getline 是讀取轉行符的,但是結果中是將轉行符丟棄的)。ci

string line;
while(getline(cin,line))//重複讀取輸入流,知道碰見結束標誌EOF
         cout<<line<<endl;輸出每一行並手動加入換行操做


 

        string 的 size()(string 類的封裝函數) 操做返回 string 對象的長度,返回類型爲 string::size_type。這是一個神奇的類型生氣,僅僅知道它是一個無符號整形。並且能存放下不論什麼 string 對象的大小。字符串

既然函數返回值是無符號整數就不能與有符號數進行比較。因爲當無符號數與負值比較時,負值會本身主動轉變爲一個比較大的無符號數。使比較結果出錯。get

string line;
auto len = line.size();//len 是size_type類型,值爲0。line 是個空串


 

       string 類定義了比較字符串的運算符。當兩個 string 對象全然一樣時,這兩個string 相等(==);

       其它比較如 < ‘。<= 。> ,>= 。string 對象遵循兩個原則:

              1.當一個string 對象A長度小於 string 對象B長度。且A與B於A長度上的字符皆一樣時,A < B。

              2.假設兩個 string 對象在某些相應的位置上不一致,則string 對象比較的結果是第一個相異字符比較的結果(遵循大寫和小寫敏感的字典序)。

string str = "Hello";
string phrase = "Hello World";
string slang = "Hiya";
//由規則 1 推斷,phrase 大於 str。由規則 2 推斷 phrase 大於 str 和 slang


 

        string 對象重載了 + 運算符,經過 + 運算符可以實現 string 與string 。字面值及字符串字面值之間的銜接。

(字符串字面值與 string 是不一樣的類型)字面值及字符串字面值不能直接相加,因爲 + 運算符是封裝與 string 類中的。

string s1("Hello") , s2(" World");
string s3 = s1 + s2;//s3 的內容是 Hello World
string s4 = s1 + ',';//s4 的內容是 Hello,
string s5 = s1 + ", World";//s5 的內容是 Hello, World


 

標準庫類型 vector

        vector 表示同一種對象的集合。vector 是一個類模板,vector 自己不是類。但倒是編譯器生成類的說明,當使用模板實例化類時必須指明實例化成何種類型,vector 使用尖括號 <> 來指明實例化類型。vector 能容納絕大多數對象做爲其元素(引用除外。引用不是對象),甚至 vector 自己。

        vector 的初始化同 string 一樣,另外C++11 還爲 vector 加入了列表初始化的方法。用花括號括起來的0個或多個初始元素值被賦給 vector 對象。

vector<string> vs = {"cs","dn"};


 

        列表初始化會給閱讀帶來混淆,因爲列表中的值既可以表示初始值也可以表示元素數量,編譯器會首先以爲是列表初始化(將列表中的值看成初始值來處理)。假設不行,纔會考慮其它初始化方式。

vector<int> v1(10);//v1有10個元素,都爲0
vector<int> v2{10};//v2有1個元素。爲10
vector<int> v3(10,1);//v3有10個元素,都爲1
vector<int> v4{10,1};//v4有兩個元素。10和1
vector<string> v5{"Hello","Hi"};//v5有兩個元素,列表初始化
vector<string> v6{10};//v6有10個空串元素


 

        向 vector 中加入元素必須使用 vector 的成員函數 push_back() 。將一個值加入到 vector 的末尾。

不能使用下標運算符。 下標運算符僅僅是用來訪問 vector(string) 對象已存在的元素。下標運算符的使用必須確保其在合理範圍內(大於 0 且小於容量)。

        vector若要使用 size_type 類型必須明白指出其是由哪一類型定義的。

vector<int>::size_type;//正確
vector::size_type;//錯誤


 

        vector 對象中元素的僅僅有在元素自己支持比較運算符的基礎上才幹進行比較(有些本身定義類並未定義比較運算符)。

 

範圍 for 語句

         範圍 for 語句遍歷給定範圍內的每一個元素。並對序列(序列可以是用花括號括起來的初始值列表。數組,vector,string等對象。這些類型的共同特色是擁有能返回迭代器的 begin end 成員)中的每一個元素進行某種操做。使用範圍 for 語句可以無需關係是否超出有效範圍。

 

string str("Hello World");
for(auto c : str)//遍歷 str 每一個字符元素
     cout<< c <<endl;
相關文章
相關標籤/搜索