Как с помощью алгоритмов удалить все элементы моего контера, которые содержат отределенный parent
понимаю что нужно использовать remove_if, но если можете — подскажите, как должна выглядить процедура
сравнения
Здравствуйте, Socket, Вы писали:
S>Как с помощью алгоритмов удалить все элементы моего контера, которые содержат отределенный parent S>понимаю что нужно использовать remove_if, но если можете — подскажите, как должна выглядить процедура
remove_if не катит — итератор не той категории, а вот линейно пройти и вызвать std::set<...>::erase(const key_type& _Key); это то что тебе нужно.
[RSDN@Home 1.1.4 stable SR1 rev. 568 on Windows 2003 5.2.3790.0]
"В любое мгновение принятия решения, лучшее, что вы можете сделать, это принять правильное решение; следующим лучшим вариантом будет принять неправильное решение, худший вариант – не принимать решения совсем" (c) Теодор Рузвельт.
>remove_if не катит — итератор не той категории
как это не с той категории? почему нельзя применять алгоритмы к таким итераторам?
p.s. так и делаю сейчас — удаляю полным перебором, но понимаю что это не верно, тоесть работет , но догадываюссь что можно сделать одной строкой,
к тому же навярняка с алгоритмом быстрее.
S>Как с помощью алгоритмов удалить все элементы моего контера, которые содержат отределенный parent S>понимаю что нужно использовать remove_if, но если можете — подскажите, как должна выглядить процедура S>сравнения
Здравствуйте, Socket, Вы писали:
S>Как с помощью алгоритмов удалить все элементы моего контера, которые содержат отределенный parent S>понимаю что нужно использовать remove_if, но если можете — подскажите, как должна выглядить процедура S>сравнения
remove не удаляет элементы, а перемещает их в конец.
Т.е. удаление с его помощью выглядит так:
sc>>так у него set а не вектор, поэтому наверное и проблема. sc>хотя нет, все работает и с set
это компилится на VC++ 8.0, но в общем случае не будет, например в SGI и gcc.
в sgi итераторы в set/multiset константны , а мутирующие алгоритмы требуют наличия mutable итератора
см.книгу Мейерса про эффективное использование STL, там подробно описано почему нельзя так делать
Re[3]: как с помощью STL удалить некоторые элементы
A>template <typename _V>
A>struct EqualToVal : std::binary_function<CUrlContainer, _V, bool>
A>{
A> bool operator()(const CUrlContainer& arg1, const _V& arg2) const
A> {
A> return arg1.parent == arg2;
A> }
A>};
A>
для remove_if разве не предикат исп-ся? или юзать через bind2nd?
у меня пара вопросов:
1) чем это лучше ?
2) зачем наследоваться от std::binary_function ?
3) пример использования этого варианта? имхо он будет сложнее:
S>для remove_if разве не предикат исп-ся? или юзать через bind2nd?
через бинд
S>1) чем это лучше ?
здесь не нужен функтор с состоянием, излишество имхо.
S>2) зачем наследоваться от std::binary_function ?
это делает функтор адаптируемым. например можно написать std::not1(EqualToVal) и т.д.
можно и от unary_function
Здравствуйте, Socket, Вы писали:
S>Как с помощью алгоритмов удалить все элементы моего контера, которые содержат отределенный parent S>понимаю что нужно использовать remove_if, но если можете — подскажите, как должна выглядить процедура S>сравнения
remove_if в данном случае не подойдет. За подробностями можно обратиться в поиск — эта тема обсуждалась не раз.
Так что вариант с "ручным проходом" и удалением, ИМХО, оптимален.
Но если хочется непременно воспользоваться алгоритмом, то можно предложить remove_copy_if:
ЗЫ
Тема прохода с удалением по set/map тоже частенько всплывает, т.к. тут есть подводные камни. На всякий случай посмотри в поиске и эту тему, или приведи свой код для экспертизы
Любите книгу — источник знаний (с) М.Горький
Re[2]: как с помощью STL удалить некоторые элементы
Здравствуйте, Socket, Вы писали:
>>remove_if не катит — итератор не той категории S>как это не с той категории? почему нельзя применять алгоритмы к таким итераторам?
Потому что у set и map нельзя выполнять присваивания элементов целиком (ключи — константы).
А remove_if делает именно это.
template<class It, class Pred>
It remove_if(It begin, It end, Pred pred)
{
It passed, testing;
// [begin,passed) - то, что прошло проверку
// [passed,testing) - буферная зона
// по окончании [begin,passed) - хорошие, [passed,end) - на выбросfor(passed=testing=begin; testing!=end; ++testing)
{
if(!pred(*testing))
{
if(passed!=testing) *passed = *testing;
++passed;
}
}
return passed;
}
В случае set нужно бегать и выборочно удалять элементы. Кстати, это же относится и к list.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[2]: как с помощью STL удалить некоторые элементы
Здравствуйте, NikeByNike, Вы писали:
NBN>remove не удаляет элементы, а перемещает их в конец.
remove затирает удаляемые элементы, и вовсе не обязано куда-то их перемещать.
Интервал [result_of_remove, end) — "свободная" память, содержащая валидные, но произвольные значения (копии передвинутых или удалённых элементов).