правильный предикат для list::remove_if()
От: Голощапов Александр  
Дата: 07.05.03 10:09
Оценка:
Привет ALL!

Вот надо удалить из std::list элемент по индексу.
Как правильно написАть предикат?

Спасибо.
С уважением
Re: правильный предикат для list::remove_if()
От: Bell Россия  
Дата: 07.05.03 10:27
Оценка: 3 (1)
Здравствуйте, Голощапов Александр, Вы писали:

ГА>Привет 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);
Любите книгу — источник знаний (с) М.Горький
Re[2]: правильный предикат для list::remove_if()
От: Голощапов Александр  
Дата: 07.05.03 10:40
Оценка:
Здравствуйте, Bell, Вы писали:

B>Во-первых, remove_if физически не удаляет элементы из контейнера,

B>во-вторых, порядок обхода диапазонов в STL не определен.
А у Б.С. это где-нибудь описано? хотелось бы про это почитать...

B>ИМХО гораздо проще, эффективнее и главное безопаснее просто erase-нуть нужный элемент:

[...]
А как этот вариант по скорости?

С уважением
Re[3]: правильный предикат для list::remove_if()
От: Кодт Россия  
Дата: 07.05.03 10:46
Оценка: 2 (1)
Здравствуйте, Голощапов Александр, Вы писали:

<>
Кстати, предикат написать не удастся, потому что предикат имеет дело с элементом списка, а сами элементы не знает свои номера.

ГА>А как этот вариант по скорости?


Список в любом случае перебирается последовательно (время O(N)).
std::advance для последовательного итератора — это
while(n > 0) ++it;

Удаление элемента (на который указывает итератор) из списка — имеет время O(1).
(=^.^=) Neko ... << RSDN@Home 1.0 beta 6a >>
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.