2014-02-08 2 views
0

Рассмотрим следующий неполный фрагмент:компенсируя позицию итератора для станд :: Список

for (std::list<CollidableNode*>::iterator it = m_Enemies.begin(); it != m_Enemies.end();it++) 
{ 
    //for current position+1 to end loop 
    for (std::list<CollidableNode*>::iterator jt = it+1; jt != m_Enemies.end();jt++) 
    { 
     //do stuff 
    } 
} 

Этот код создает очевидные ошибки, но иллюстрирует то, что я пытаюсь сделать, что: во вложенном цикле, установите начальную точку цикла в текущей позиции в списке плюс одну позицию, чтобы не выполнялись дублирующие проверки.

Соображения состоят в том, что список имеет высокую динамику по размеру, причем список проверяется для элементов для удаления каждого обновления, а новые элементы добавляются часто, так что удаление происходит быстрее, чем вектор.

Возможно ли переместить итератор в нужное положение, и если да, то как мне это сделать?

Заранее спасибо

+0

В C++ 11 существует 'std :: next'; вы также можете написать свой собственный в C++ 03: 'template FwdIt next (FwdIt i, int n = 1) {std :: advance (i, n); return i; } ' – dyp

+1

*« Соображения [...] будут быстрее, чем вектор ». * Хотите скорость? Мера. ([Hinnant] (http://stackoverflow.com/a/18303787/420683)). Также см. Http://www.youtube.com/watch?v=YQs6IC-vgmo – dyp

+0

Чтобы список был быстрее, вы в основном ** имеете ** для хранения итераторов между итерациями: и даже тогда нет никакой гарантии. Если вы этого не сделаете, 'std :: remove_if' делает удаление и итерацию быстрее на' vector', чем 'list'. Бывают случаи, когда 'list' быстрее, но они ** редки **. – Yakk

ответ

Смежные вопросы