Рассмотрим следующий неполный фрагмент:компенсируя позицию итератора для станд :: Список
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
}
}
Этот код создает очевидные ошибки, но иллюстрирует то, что я пытаюсь сделать, что: во вложенном цикле, установите начальную точку цикла в текущей позиции в списке плюс одну позицию, чтобы не выполнялись дублирующие проверки.
Соображения состоят в том, что список имеет высокую динамику по размеру, причем список проверяется для элементов для удаления каждого обновления, а новые элементы добавляются часто, так что удаление происходит быстрее, чем вектор.
Возможно ли переместить итератор в нужное положение, и если да, то как мне это сделать?
Заранее спасибо
В C++ 11 существует 'std :: next'; вы также можете написать свой собственный в C++ 03: 'template FwdIt next (FwdIt i, int n = 1) {std :: advance (i, n); return i; } ' –
dyp
*« Соображения [...] будут быстрее, чем вектор ». * Хотите скорость? Мера. ([Hinnant] (http://stackoverflow.com/a/18303787/420683)). Также см. Http://www.youtube.com/watch?v=YQs6IC-vgmo – dyp
Чтобы список был быстрее, вы в основном ** имеете ** для хранения итераторов между итерациями: и даже тогда нет никакой гарантии. Если вы этого не сделаете, 'std :: remove_if' делает удаление и итерацию быстрее на' vector', чем 'list'. Бывают случаи, когда 'list' быстрее, но они ** редки **. – Yakk