2015年5月11日

[C++] The Previous Element of vector::begin() Is Not vector::end()

在使用 STL 的 container 時,相信類似以下這段 code 的片段不是什麼很希奇的事情
std::vector<int> vec;
// blah blah blah
if (--iter != vec.end()) { /* blah blah blah */ }
很顯而易見的邊緣判斷,當 iterator 已經是指向最一開頭的元素時,想要再往前存取前一個元素時就該停止了

不過這段 code 在一個特定的情況下會失效,就是當 iter == vec.begin() 時!沒記錯的話這問題發生在把 container 從 list 換成 vector

原因其實也不難懂,vector 底層的實作是 array,換言之 vector iterator 一般來說在其底層就會是個 array pointer。所以只要用 array pointer 的觀點來想就會知道為什麼那段 code 會有問題囉。

而 vector 因為底層是 array,但又需要能夠動態增減其大小,因此還會有 iterator validity 的問題 (確切一點的說法是所有的 STL container,但是 vector 最容易遇到),類似這類的問題第一次遇到大概得要花上個數小時找問題吧...

沒有留言:

張貼留言