因爲我一直在執行我自己的libstdC++一個個人項目。一點一滴,我一直在取得一些不錯的進展。通常情況下,我會使用示例從http://www.cplusplus.com/reference/一些基本的測試案例,以確保我有明顯的功能預期工作。這是違法的權利?
今天,我遇到了一個問題與std::basic_string::replace
,特別是使用從網站(http://www.cplusplus.com/reference/string/string/replace/)逐字複製的例子(我添加了一個評論指出問題線)的迭代器基於版本:
// replacing in a string
#include <iostream>
#include <string>
using namespace std;
int main()
{
string base="this is a test string.";
string str2="n example";
string str3="sample phrase";
string str4="useful.";
// function versions used in the same order as described above:
// Using positions: *123456789*12345
string str=base; // "this is a test string."
str.replace(9,5,str2); // "this is an example string."
str.replace(19,6,str3,7,6); // "this is an example phrase."
str.replace(8,10,"just all",6); // "this is just a phrase."
str.replace(8,6,"a short"); // "this is a short phrase."
str.replace(22,1,3,'!'); // "this is a short phrase!!!"
// Using iterators: *123456789*
string::iterator it = str.begin(); //^
str.replace(it,str.end()-3,str3); // "sample phrase!!!"
// *** this next line and most that follow are illegal right? ***
str.replace(it,it+6,"replace it",7); // "replace phrase!!!"
it+=8; // ^
str.replace(it,it+6,"is cool"); // "replace is cool!!!"
str.replace(it+4,str.end()-4,4,'o'); // "replace is cooool!!!"
it+=3; // ^
str.replace(it,str.end(),str4.begin(),str4.end());
// "replace is useful."
cout << str << endl;
return 0;
}
在我的版本替換是用一個臨時字符串來實現的,然後我用*this
來創建一個臨時字符串。這顯然使任何迭代器無效。那麼我是否正確,該示例是無效的?因爲它存儲迭代器,做一個替換,然後再次使用迭代器?
我的標準的副本(ISO 14882:2003 - 21.3p5)說:
引用,指針和迭代器 指的是 的basic_string序列的元素可以是 由以下無效 該basic_string的對象的用途:
- As an argument to non-member functions swap() (21.3.7.8), operator>>() (21.3.7.9), and getline() (21.3.7.9). - As an argument to basic_string::swap(). - Calling data() and c_str() member functions. - Calling non-const member functions, except operator[](), at(), begin(), rbegin(), end(), and rend(). - Subsequent to any of the above uses except the forms of insert() and erase() which return iterators, the first call to non-const member functions operator[](), at(), begin(), rbegin(), end(), or rend().
關於非const成員函數的入口似乎涵蓋這一點。所以,除非我錯過了一些東西,那麼這段代碼使用了無效的迭代器吧?當然這個代碼對於gcc的libstdC++來說工作得很好,但是我們都知道,只要符合標準就沒有什麼證明。
他們需要建立更多的監獄,eep。 – 2010-07-01 19:16:34
如果你想知道這個 - 不要懷疑。 cplusplus.com充滿了bug。 – 2010-07-01 19:29:46