Здравствуйте, Голощапов Александр, Вы писали:
ГА>Привет ALL!
ГА>Вот надо удалить из std::list элемент по индексу.
ГА>Как правильно написАть предикат?
ГА>Спасибо.
ГА>С уважением
Во-первых, remove_if физически не удаляет элементы из контейнера, во-вторых, порядок обхода диапазонов в STL не определен.
ИМХО гораздо проще, эффективнее и главное безопаснее просто erase-нуть нужный элемент:
list<int> lst;
lst.push_back(1);
...
int nIndex2Remove = ...;
list<int>::iterator it2Remove = lst.begin();
advance(it2Remove, nIndex2Remove);
lst.erase(it2Remove);
Здравствуйте, Голощапов Александр, Вы писали:
<>
Кстати, предикат написать не удастся, потому что предикат имеет дело с элементом списка, а сами элементы не знает свои номера.
ГА>А как этот вариант по скорости?
Список в любом случае перебирается последовательно (время O(N)).
std::advance для последовательного итератора — это
while(n > 0) ++it;
Удаление элемента (на который указывает итератор) из списка — имеет время O(1).
(=^.^=) Neko ... << RSDN@Home 1.0 beta 6a >>