作者b6s (http://b6s.blogspot.com)
站內Programming
標題Re: 請問STL的string這樣寫有錯誤嗎?
時間Thu Aug 17 23:55:22 2006
※ 引述《Killercat (殺人貓™)》之銘言:
: An input iterator addressing the first occurrence of the specified value in
: the range being searched. If no such value exists in the range, the iterator
: returned addresses the last position of the range, one past the final element.
: (這個基本上跟.end()的定義相同)
: 我比較不明白的是, .end()跟string::npos應該不會是一樣的直吧 +_+
: 不過我似乎也有string::npos當傳回值的印象...?
: 請問這大概是...?
抱歉,我沒說清楚一件事。您在原程式碼中用的和現在查到的這個是 <algorithm>
的 find(),我提到的則是 <string> 的 string::find(),
string::npos 是 ANSI C++ 規定的傳回值,配合 string::size_type
針對 VC,請見
http://msdn2.microsoft.com/en-us/library/tbbk8hs6.aspx
當您把 string 當 container 操作它的 iterator 時,
string::end 照理說和 string::npos 的語意相通。
但是,重點來了,迴圈裡有 seq+=inl[i];
表示 string 當 container 時的 iterator 不再安全了,
換句話說,seq.end() 不再保證有如您預期的行為。
所以,我會建議改用 string::find() 和 string::npos
當然,最好是重新考慮用別的寫法。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 59.105.131.104
※ 編輯: b6s 來自: 59.105.131.104 (08/17 23:56)
※ 編輯: b6s 來自: 59.105.131.104 (08/17 23:57)
推 Killercat:大致上明白了 非常感謝您解說/bow 218.163.161.9 08/18 00:24
推 kafy:不懂,每次的end()不是都是重新呼叫的嗎? 61.216.2.31 08/18 02:05
推 kafy:我自己跑的結果是沒問題的耶... 61.216.2.31 08/18 02:12
推 cplusplus:每次都是在比較後才append到seq220.139.233.250 08/18 22:26
→ cplusplus:每次也都是重新呼叫end 照理講不會危險220.139.233.250 08/18 22:27
→ cplusplus:如果重新呼叫有危險那這個lib應該爛掉了220.139.233.250 08/18 22:28
推 b6s:請參考 Effective C++ 之類的書 59.105.131.104 08/19 02:15
→ b6s:原 po 說在 VC7.1 有問題,mingw 沒問題 59.105.131.104 08/19 02:16
→ b6s:這種事其實不少見...... 59.105.131.104 08/19 02:16
推 b6s:btw, Design Pattern 書裡也有講。 59.105.131.104 08/19 02:20
推 cplusplus:所以vc 7.1 的lib可能爛了嗎220.139.233.250 08/19 15:06
推 cplusplus:請問在EFFECTIVE C++裡哪個議題呢? 謝謝220.139.233.250 08/19 15:08
→ cplusplus:但我還是絕得不該爛掉 不然就VC的爛掉了220.139.233.250 08/19 15:09
推 cplusplus:剛剛測試在VC7.1跟8都沒問題...220.139.233.250 08/19 15:14
推 b6s:My bad, 是 exceptional C++ 59.105.131.104 08/23 19:09