2013-02-28 79 views
0

web site cplusplus documentation爲的std :: string構造以兩個輸入迭代狀態部分:什麼是std :: string(itr,itr)應該這樣做?

副本的字符的範圍在[第一,最後的序列),以相同的順序。

第一個,最後一個: 將迭代器輸入到範圍中的初始位置和最終位置。使用的範圍是[first,last),它包含first和last之間的所有字符,包括first指向的字符,但不包含last指向的字符。

這是什麼意思在退化情況下first == last?一方面包含first,另一方面last被排除在外?官方的C++標準在這種情況下應該發生什麼?應拋出異常嗎?

+0

空字符串的構造不是這樣一個退化的情況。 – 2013-02-28 18:17:24

+2

* *文檔沒有說明。 – 2013-02-28 18:18:04

+0

@WilliamKF:cplusplus.com不是「The」文檔。這是某人對文檔的總結。有些人在網站的準確性方面也存在問題,儘管海事組織似乎已經修復了大部分錯誤。 – 2013-02-28 18:22:57

回答

4

我不知道它是什麼文件,你正在閱讀,但標準說(§21.4.2/ 15):

[..]的範圍0123構建從值的字符串,如在序列要求,表

並且序列要求表(表100)限定X a(i, j)指示一個有效的範圍[i, j)爲:

構造一個序列容器等於範圍[i, j)

範圍是有效當第二個迭代器可從第一個迭代器(通過遞增)到達時。對於兩個相等的迭代器,範圍是空的。見§24.2.1/ 7:

範圍是一對指定的計算的開始和結束時的迭代器。範圍[i,i)是空的範圍;通常,範圍[i,j)指的是數據結構中的元素,從i指向的元素開始,直到但不包括j指向的元素。當且僅當ji到達時,範圍[i,j)有效。將庫中的函數應用於無效範圍的結果未定義。

所以如果first == last,如你所說,你會得到一個空字符串。如果last無法從first到達,則表明您的行爲未定義。

3

範圍是空的,所以沒有什麼可複製的。結果是一個空字符串。

2

這是什麼意思在第一次==最後的退化情況?

這意味着輸入範圍是空的,所以字符串將是空的。

標準說在這種情況下應該發生什麼?

C++ 11 24.2.1/7說:

一系列[i,i)是一個空的範圍

0

我已經多次使用它的一件事是從一個大C風格字符串(const char*)中的子字符串構造一個std::string。你可以傳遞兩個const char*指針,它會從第一個指針開始的字符和第二個指針前面的字符構造一個字符串。如果first == last,結果是一個空字符串。如果first > last,行爲是未定義的(感謝Mooing Duck)

+3

這是未定義的行爲,不需要拋出異常 – 2013-02-28 18:21:47

+0

已更正。謝謝! – 2013-03-01 06:17:06

相關問題