擴充套件 String類 構造字串

2021-10-07 04:36:00 字數 4681 閱讀 3568

程式清單16.1使用了string的7個建構函式(用ctor標識,這是傳統c++中建構函式的縮寫)。表16.1簡要的描述了這些建構函式。

使用建構函式時都進行了簡化,即隱藏了這樣乙個事實:string實際上是模板具體化basic_string的乙個typedef,同時省略了與記憶體管理相關的引數。

size_type是乙個依賴於實現的整型,是在標頭檔案string中定義的。string類將string::npos定義為字串的最大長度,通常為unsigned int的最大值。另外,**中使用縮寫nbts(null-terminated string)來表示以空字元結束的字串——傳統的c字串。

表16.1 string類的建構函式

建構函式

描述*string(const char s)

將string物件初始化為s指向的nbts

string(size_type n,char c)建立乙個包含n個元素的string物件,其中每個元素都被初始化為字元c

string(const string &str)將乙個string物件初始化為string物件str(複製建構函式)

string()建立乙個預設的string物件,長度為0(預設建構函式)

string(const char s,size_type n)

將string物件初始化為s指向的nbts的前n個字元,即使超過了nbts結尾

template<classiter> string(iter begin,iter end)

將string物件初始化為區間[begin,end)內的字元,其中begin和end的行為就像指標,用於指定位置,範圍包括begin在內,但不包括end

string(const string & str,string size_type pos=0,size_type n=npos)將乙個string物件初始化為物件str中從位置pos開始到結尾的字元,或從位置pos開始的n個字元

string(string &&str)noexcept這是c++11新增的,它將乙個string物件初始化為string物件str,並可能修改str(移動建構函式)

string(initializer_listil

這是c++11新增的,它將乙個string物件初始化為初始化列表il中的字元

程式清單16.1 str1.cpp

-- introducing the string class

#include

#include

//using string constructors

intmain()

程式清單16.1的程式首先演示了可以將string物件初始化為常規的c-風格字串,然後使用過載的《運算子來顯示它:

string one(「lottery winner!」);		//ctor #1

cout《接下來的建構函式將string物件two初始化為由20個$字元組成的字串:

string two(20,』$』); //ctor #2

複製建構函式將string物件three初始化為string物件one:

string three(one);					//ctor #3
過載的+=運算子將字串「oops!」附加到字串one的後面:

one += 「 oops!」;					//overloaded +=
這裡是將乙個c-風格字串附加到乙個string物件的後面。但+=運算子被多次過載,以便能夠附加string物件和單個字元:

同樣,=運算子也被過載,以便可以將string物件,c-風格字串或char值賦給string物件:

two = 「sorry! that was 「;		//assign a c-style string

two = one; //assign a string object (not in program)

two = 『?』; //assign a char value (not in program)

過載[ ]運算子使得可以使用陣列表示法來訪問string物件中的各個字元:

three[0] = 『p』;
預設建構函式建立乙個後可對其進行賦值的空字串:

string four;					//ctor #4

four = two + three; //overloaded +, =

第2行使用過載的+運算子建立了乙個臨時string物件,然後使用過載的=運算子將它賦給物件four。正如所預料的,+運算子將其兩個運算元組合成乙個string物件。該運算子被多次過載,以便第二個運算元可以是string物件,c-風格字串或char值。

第5個建構函式將乙個c-風格字串和乙個整數作為引數,其中的整數引數表示要複製多少個字元:

char alls[ ] = 「all』s well that ends well」;

string five(all, 20); //ctor #5

從輸出可知,這裡只使用了前20個字元(」all』s well that ends」)來初始化five物件。正如表16.1指出的,如果字元數超過了c-風格字串的長度,仍將複製請求數目的字元。所以在上面的例子中,如果用40代替20,將導致15個無用字元被複製到five的結尾處(即建構函式將記憶體中位於字串」all』s well that ends well」後面的內容作為字元)。

第6個建構函式有乙個模板引數:

templatestring(iter begin, iter end);
begin和end將像指標那樣,指向記憶體中兩個位置。建構函式將使用begin和end指向的位置之間的值,對string物件進行初始化。[begin,end)來自數學中,意味著包括begin,但不包括end在內的區間。也就是說,end指向被使用的最後乙個值後面的乙個位置。請看下面語句:

string six(alls+6,alls+10); //ctor #6

由於陣列名相當於指標,所以alls+6和alls+10的型別都是char*,因此使用模板時,將用型別char*替換iter。第乙個引數指向陣列alls中的第乙個w,第二個引數指向第乙個well後面的空格。因此,six將被初始化為字串「well」。

現在假設要用這個建構函式將物件初始化為另乙個string物件(假設為five)的一部分內容,則下面的語句不管用:

string seven(five+6,five+10);
原因在於,物件名(不同於陣列名)不會被看作是物件的位址,因此five不是指標,所以five+6是沒有意義的。然而,five[6]是乙個char值,所以&five[6]是乙個位址,因此可被用作該建構函式的乙個引數。

string seven (&five[6],&five[10]);		//ctor #6 again
 第7個建構函式將乙個string物件的部分內容複製到構造的物件中: string eight(four,7,16);

上述語句從four的第8個字元(位置7)開始,將16個字元複製到eight中。
建構函式string(string && str)類似於複製建構函式,導致新建立的string為str的副本。但與複製建構函式不同的是,它不保證將str視為const。這種建構函式被稱為移動建構函式(move constructor)。

建構函式string(initializer_listil)讓您能夠將列表初始化語法用於string類。也就是說,它使得下面這樣的宣告是合法的:

string piano_man = ;

string comp_lang ;

就string而言,這可能用處不大,因為使用c-風格字串更容易,但確實實現了讓列表初始化語法普遍使用的意圖。

from 《c++ primer plus》

by suki

遞推 構造字串

problem description umr 閒來無聊玩起了自己的名字,現在的她想知道對於給定的長度 n,只用自己的 u m r 這 3 個字元最多能構成多少種不同的字串。但是因為 umr 並不喜歡 mm 所以 mm 是不能連在一起的。input 輸入資料有多組 資料組數不超過 100000 到 ...

cug1692 構造字串

題目大意 乙個字串有a,b組成,告訴你 a b ab ba 的數量s a s b s ab s ba 求字典序最小的字串 無解輸出 1。思路 首先若ab和ba的差大於1,則無解。其次,若s a s ab s ba 且 s b s ab s ba 則無解。當s ab s ba 都為0但s a 和s b...

c語言 用鍊錶構造字串

今天乙個同學問我怎麼用鍊錶構造字串 然後我簡單的說了下思路 不過他還是沒寫出來 因為資料結構在講字串的時候,老師主要講了順序構造字串 鏈式構造字串缺點太多 自己也沒有看 然後自己今天寫了一下 支援動態擴充套件 主檔案 include include liststring.h int main cha...