2013-04-06 60 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