2013-04-06 57 views
0

誰能告訴我爲什麼我的列表迭代器討厭.end() - 1?我想在列表結束之前迭代到一個,我的印象是,你總是可以做到這一點!上請求列表迭代器和 - 運算符的問題

std::list<Hammer::shared_ptr<Hammer::Actor>> collisionActorsList; 

std::list<Hammer::shared_ptr<Hammer::Actor>>::iterator _actorUpdateIter =   collisionActorsList.begin(); 
while(_actorUpdateIter != (collisionActorsList.end()-1)) // ERROR HERE 
{ 
    // check against every other actor 
    std::list<Hammer::shared_ptr<Hammer::Actor>>::iterator _otherActorsUpdateIter = _actorUpdateIter+1; // ERROR HERE TOO 
    while(_otherActorsUpdateIter != collisionActorsList.end()) 
    {// SOME STUFF } 
} 
+2

你能分享證明這種仇恨的代碼嗎? – Johnsyweb 2013-04-06 04:07:37

+0

當然,它的確很複雜,但會嘗試。 – angryInsomniac 2013-04-06 04:08:36

+0

也許你會用'--'將'-'弄糊塗。您可以遞減最後一個迭代器。 – jeffmagill 2013-04-06 04:19:51

回答

3

std::list

代碼使用一個雙向迭代,它不支持operator-operator+。使用std::prev(collisionActorsList.end())std::next(_actorUpdateIter)

正如在評論中指出的,你應該知道你的列表是否爲空。如果是這樣,這些將無法做到你想要的。有一個簡單的功能:collisionActorsList.empty()

+0

注意:['std :: prev()'](http://en.cppreference.com/w/cpp/iterator/prev)僅在C++ 11以後纔可用。 – Johnsyweb 2013-04-06 04:15:52

+0

做「while(_actorUpdateIter!= std :: prev(collisionActorsList.end()))」會導致運行時斷言說「列表迭代器不可遞減」 – angryInsomniac 2013-04-06 04:16:37

+0

@angryInsomniac,我不知道爲什麼。雙向迭代器是可遞減的。 – chris 2013-04-06 04:20:15