Существует ли в boost или std сабжевый алгоритм для контейнеров с поддержкой операции erase() с возвратом следующего итератора?
Или нужно писать самому?
Здравствуйте, nen777w, Вы писали:
N>Существует ли в boost или std сабжевый алгоритм для контейнеров с поддержкой операции erase() с возвратом следующего итератора? N>Или нужно писать самому?
Без возврата следующего итератора можно посмотреть на remove_erase_if.
"For every complex problem, there is a solution that is simple, neat,
and wrong."
Здравствуйте, nen777w, Вы писали:
N>Существует ли в boost или std сабжевый алгоритм для контейнеров с поддержкой операции erase() с возвратом следующего итератора? N>Или нужно писать самому?
Среди стандартных алгоритмов я такой не знаю. Соответствующий алгоритм должен очевидно иметь в качестве параметров два предиката: первый для проверки условия и второй для вызова функции. При этом в первый предикат должен передаваться разыменованный итератор, а во второй предикат — сам итератор. За boost не берусь отвечать.
Здравствуйте, nen777w, Вы писали:
N>Существует ли в boost или std сабжевый алгоритм для контейнеров с поддержкой операции erase() с возвратом следующего итератора? N>Или нужно писать самому?
Я думаю, что подобный алгоритм должен выглядеть следующим образом:
template <typename ForwardIterator,
typename Condition,
typename Function>
void execute_if( ForwardIterator first,
ForwardIterator last,
Condition cond,
Function func )
{
while ( first != last )
{
if ( cond( *first ) ) first = func( first );
else ++first;
}
}
При этом при передаче функционального объекта func придется его конструктору передавать в качестве параметра неконстатную ссылку на ваш контейнер.
С>Среди стандартных алгоритмов я такой не знаю. Соответствующий алгоритм должен очевидно иметь в качестве параметров два предиката: первый для проверки условия и второй для вызова функции. При этом в первый предикат должен передаваться разыменованный итератор, а во второй предикат — сам итератор. За boost не берусь отвечать.
Вопрос не о том как написать а о том как не писать велосипедов.
N>>Существует ли в boost или std сабжевый алгоритм для контейнеров с поддержкой операции erase() с возвратом следующего итератора? N>>Или нужно писать самому? AJD>Без возврата следующего итератора можно посмотреть на remove_erase_if.
Это который в boost/range, спасибо.
Мне как раз весь контейнер прошерстить нужно, жаль что нет более универсального основанного на итераторах, когда понадобится нужно будет самому писать.
Здравствуйте, nen777w, Вы писали:
N>Существует ли в boost или std сабжевый алгоритм для контейнеров с поддержкой операции erase() с возвратом следующего итератора? N>Или нужно писать самому?
Здравствуйте, nen777w, Вы писали:
С>>Среди стандартных алгоритмов я такой не знаю. Соответствующий алгоритм должен очевидно иметь в качестве параметров два предиката: первый для проверки условия и второй для вызова функции. При этом в первый предикат должен передаваться разыменованный итератор, а во второй предикат — сам итератор. За boost не берусь отвечать.
N>Вопрос не о том как написать а о том как не писать велосипедов.
Можно просто попробовать решить эту задачу, как говорится, в лоб без причуд
template <typename Container,
typename UnaryPredicate>
void execute_if( Container &c, UnaryPredicate unary_predicate )
{
typename Container::iterator first = c.begin();
while ( first != c.end() )
{
if ( unary_predicate( *first ) ) first = c.erase( first );
else ++first;
}
}
Здравствуйте, Сыроежка, Вы писали:
С>Можно просто попробовать решить эту задачу, как говорится, в лоб без причуд
Так это и есть boost::remove_erase_if, разве нет?
Конечно, не считая того, что данная реализация работает на векторе за квадратичное время (точнее, за O(n*m) где n — длина вектора, m — количество удаляемых элементов).
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, Сыроежка, Вы писали:
С>>Можно просто попробовать решить эту задачу, как говорится, в лоб без причуд
К>Так это и есть boost::remove_erase_if, разве нет? К>Конечно, не считая того, что данная реализация работает на векторе за квадратичное время (точнее, за O(n*m) где n — длина вектора, m — количество удаляемых элементов).
Для вектора естественно проще использовать комбинацию стандартного алгоритма std::remove_if и функцию — член класса erase.
Здравствуйте, Сыроежка, Вы писали:
К>>Так это и есть boost::remove_erase_if, разве нет? К>>Конечно, не считая того, что данная реализация работает на векторе за квадратичное время (точнее, за O(n*m) где n — длина вектора, m — количество удаляемых элементов).
С>Для вектора естественно проще использовать комбинацию стандартного алгоритма std::remove_if и функцию — член класса erase. С>Но автора темы это почему-то не устраивает.
Сдаётся мне, что не устраивает именно из-за того, что для разных контейнеров одно и то же действие нужно выполнять разными способами.
И что буст именно так и поступает, перегружая функцию для известных типов контейнеров.