tag:blogger.com,1999:blog-10303035.post113053622010483291..comments2024-02-04T23:20:04.066+03:00Comments on Алёна C++: std::remove и std::remove_if на самом деле ничего не удаляютAlenahttp://www.blogger.com/profile/09389124127364799922noreply@blogger.comBlogger13125tag:blogger.com,1999:blog-10303035.post-77177073498780422982019-08-13T00:05:49.406+03:002019-08-13T00:05:49.406+03:00Алгоритмы работают также и со встроенными массивам...Алгоритмы работают также и со встроенными массивами, размер которых сократить нельзя, он константный и должен быть известен на момент компиляции. Вот реальная причина того, что remove и remove_if ничего не удаляют. Просто получаете новый конец и работаете до него. Привычно для тех, кто не разбалован шаблонными контейнерами.<br />Кстати, во множестве случаев и для контейнеров удалять не нужно помеченные для удаления элементы. Просто задайте новые границы для итерирования, чтобы не выполнять лишней работы.senatushttps://www.blogger.com/profile/15139846930134955779noreply@blogger.comtag:blogger.com,1999:blog-10303035.post-26671514440655679592016-09-19T14:54:19.004+03:002016-09-19T14:54:19.004+03:00Аноним, открывший тему, а в каких других случаях r...Аноним, открывший тему, а в каких других случаях remove работает иначе? Он всегда копирует элементы. На примере remove_if: те элементы последовательности, что не удовлетворяют предикату (3 аргументу) становятся на первое место, а те что удовлетворили (под удаление) становятся на последние и на начало этих элементов ссылается возвращаемый итератор, чтобы нам было проще удалить, это правда, но на практике такое не выходит, т.к. механизм немного сложнее: алгоритм обращается с элементами, удовлетворивших условия предиката, как со "свободными" местами и если далее встречает элемент - неудовлетворительный при необходимости перезаписывает их т.к. они "заслуживают" того места и в более сложной последовательности пример, куда сложнее получается.<br />И да кстати я сам не знаю что быстрее partition, а затем resize или же remove_if+eraseAnonymoushttps://www.blogger.com/profile/07014126869530784132noreply@blogger.comtag:blogger.com,1999:blog-10303035.post-78927608753350277362012-05-16T07:29:46.536+04:002012-05-16T07:29:46.536+04:00nictrace
А почему нельзя делать сразу erase бе...<b>nictrace</b><br /><br /><i> А почему нельзя делать сразу erase без всяких remove??</i><br /><br />В erase передаются итераторы. Никаких условий там указывать нельзя. Для того, чтобы получить правильные итераторы, нужен remove.Alenahttps://www.blogger.com/profile/09389124127364799922noreply@blogger.comtag:blogger.com,1999:blog-10303035.post-80828766501619514472012-05-15T17:39:41.599+04:002012-05-15T17:39:41.599+04:00А почему нельзя делать сразу erase без всяких remo...А почему нельзя делать сразу erase без всяких remove??nictracehttps://www.blogger.com/profile/11710737689154557206noreply@blogger.comtag:blogger.com,1999:blog-10303035.post-67372085984906648932011-01-30T20:21:47.597+03:002011-01-30T20:21:47.597+03:00К предыдущему сообщению забыл добавить, что для st...К предыдущему сообщению забыл добавить, что для std::vector копирование элементов при вызове std::remove происходит.Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-10303035.post-54583651728863551912011-01-30T20:17:27.945+03:002011-01-30T20:17:27.945+03:00std::remove операции копирования вызывает у перед...std::remove операции копирования вызывает у передвигаемых элементов, что у меня вызывает недоумение - зачем? Может кто популярно объяснит?Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-10303035.post-85698728691919820862010-11-16T13:02:09.164+03:002010-11-16T13:02:09.164+03:00А вместо erase() лучше делать resize(). Ведь эта о...А вместо erase() лучше делать resize(). Ведь эта операция существенно быстрее. Единственный недостаток - нужно знать, какое кол-во элементов удалилось с помощью remove()._Andrey_https://www.blogger.com/profile/17854206028286958662noreply@blogger.comtag:blogger.com,1999:blog-10303035.post-57832865152546160292010-11-04T00:19:11.241+03:002010-11-04T00:19:11.241+03:00Подниму темку.
И Мейерс, и Саттер пишут, что алго...Подниму темку.<br /><br />И Мейерс, и Саттер пишут, что алгоритм remove не знает от переданного итератора, к какому контейнеру он относится. А зачем это знать? От итератора можно узнать тип контейнера и тип элемента, к примеру, vector::iterator. Зная это, remove может (по идее) вызвать деструктор (если тип не встроенный) и в зависимости от типа самого контейнера произвести удаление элемента.<br /><br />Теоретически это можно, я думаю, но тогда простой алгоритм remove превращается в монстра, который должен знать менеджеры памяти всех последовательных существующих контейнеров (ес-но, при появлении новых это все дело будет в remove разрастаться), что, в общем-то не есть хорошо - функция начинает выполнять слишком много задач. Сложно, трудная поддержка, небезопасно. <br /><br />Мне кажется в этом реальная причина существования пары remove/erase, а не незнание контейнера. Зачем его знать... А так бы сдвинули элементы, а остальные удалили бы, без вызова erase. Но, повторюсь, имо, накладно это получится.Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-10303035.post-21438379448066807892010-10-30T13:44:49.489+04:002010-10-30T13:44:49.489+04:00Cаттер "Стандарты программирования на с++&quo...Cаттер "Стандарты программирования на с++"<br />совет 82Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-10303035.post-39849485983027357862010-02-11T00:35:51.118+03:002010-02-11T00:35:51.118+03:00Все же list::remove() тоже не удаляет мусор, и для...Все же list::remove() тоже не удаляет мусор, и для list тоже нужно вызывать erase() после remove(), верно?Chumakhttps://www.blogger.com/profile/17796458394367641338noreply@blogger.comtag:blogger.com,1999:blog-10303035.post-78164001379451673672009-09-12T17:09:57.533+04:002009-09-12T17:09:57.533+04:00Как раз залип в отладке на этом моменте. Спасибо з...Как раз залип в отладке на этом моменте. Спасибо за разъяснение!=)pure virtualhttps://www.blogger.com/profile/16786779539675023451noreply@blogger.comtag:blogger.com,1999:blog-10303035.post-12778911047253705782008-07-01T23:59:00.000+04:002008-07-01T23:59:00.000+04:00Мейерс "Эффективное использование STL" совет 33.Мейерс "Эффективное использование STL" совет 33.Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-10303035.post-68215885779701900822008-02-19T14:37:00.000+03:002008-02-19T14:37:00.000+03:00Респект и Уважуха!Респект и Уважуха!Anonymousnoreply@blogger.com