Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C++ Builder > стандартные алгоритмы |
Автор: ano360 23.1.2007, 18:51 | ||
Есть в библиотеке стандартных шаблонов такой алгоритм как Unique-по идее он удаляет все повторяющиеся элементы. Есть ли какаиенибудь ограничения или особенности при сипользовонии этой функци. У меня она почемуто не работает.
|
Автор: zkv 23.1.2007, 19:09 | ||
а в чем это выражается?
|
Автор: ano360 23.1.2007, 19:17 | ||||||
дубликаты не удаляются. Просто не удаляются, как были, так и остаются.
Да. там просто ОЧЕНЬ много всякого када, на имеющего к проблеме отношения. массив точно заполняется, сразу после вызова unique, у меня след. код.
Да, и вот ещё странность-vectorTemp не чистится, но это пока не доказано Добавлено @ 19:22
при запуске следующего выводятся 2 идентичные строки: 2 2~ 2 3~ 2 4~ 3 2~ 3 4~ 4 2~ 3 2~ 3 4~ 4 2~ 4 4~ 5 2~ 5 3~ 5 4~ 4 4~ 2 2~ 2 3~ 2 4~ 3 2~ 3 4~ 4 2~ 3 2~ 3 4~ 4 2~ 4 4~ 5 2~ 5 3~ 5 4~ 4 4~ |
Автор: ano360 23.1.2007, 19:40 |
кстати, вариант запуска unique(vectorTemp.begin(),vectorTemp.end()); у меня не работает, ыдаёт ошибку и посылает к исходникам, хотя operator== для ТРКордс, как вы видете, определён. У кого есть какие идеи? Даже самые безумные |
Автор: zkv 23.1.2007, 19:48 | ||
посмотрите комментарии в этом примере, здесь говорится про последовательные элементы:
|
Автор: ano360 23.1.2007, 20:05 |
Это всё,конечно, здорово, и я вспомнил как пользоваться промтом, но мне это чёто не очень помогло. Мож я тупой? или уникуе удаляет только одинаковые эл-ты, стоящие друг за другом? |
Автор: ano360 23.1.2007, 20:29 |
в чаком случае мне проще будет самому написать ф-ю удаления повторяющихся э-тов. |
Автор: ano360 23.1.2007, 20:50 | ||
А как получить интератор элемента вектора с опред номером. допустим 3 его эл-та? Я тут функцмю сортировки накидал, вдруг кому понадобится, только необходимо знать интератор эл -та
|
Автор: segmentation_fault 24.1.2007, 00:01 | ||||
ano360, итератор определяется так:
Но твоя функция не будет работать, т.к. после удаления элементов, размер вектора уменьшается, так что твой цикл
будет указывать за пределы вектора. Если порядок элементов вектора не принципиален, можешь сделать так: создай сет, скопируй туда содержимое вектора, очисти вектор и скопируй туда содержимое сета. Одинаковые элементы в сет не копируются, так что получишь то, что хотел. |
Автор: Vyacheslav 24.1.2007, 13:22 | ||||
Про unique 1. Во-первых он "удаляет" смежные дубликаты 2. А во-вторых, он реально ничего не удаляет, как и любой remove-подобный алгоритм. Он просто перемещает дубликаты за логический конец и возвращает итератор этого логического конца. Причем, что самое неприятное, никто при этом не гарантирует, что в результате перемещения, часть перемещаемых элементов не исчезнет. Поэтому вызов такого рода грубейшая ошибка
Чтобы происходло реальное удаление смежных дубликатов следует использовать связку erase-unique
|
Автор: stmamont 24.1.2007, 14:08 |
ano360, у этой сортировки сложность n^2 , логичней использовать встроенную в stl сортировку |
Автор: ano360 24.1.2007, 17:23 | ||
А конкретней? Если вы имеете ввиду sort |
Автор: ano360 24.1.2007, 17:40 | ||||
Вот конечный вр-т:
Добавлено @ 17:41
Что вы имели ввиду? про с ложность n^2. Это как? |
Автор: stmamont 24.1.2007, 17:53 | ||
сложность алгоритма - n^2 в то время как средняя сложность алгоритма встроенного sort составляет n * log n где n количество сортируемых элементов в массиве. |
Автор: ano360 24.1.2007, 18:17 |
круто, но мне ещё ведь надо и удалить все лишние эл-ты, а не только отсортировать, а моя ф-я делает итои другое. |
Автор: segmentation_fault 24.1.2007, 19:53 |
ano360, а почему бы тебе не отсортировать сначала вектор стандартным алгоритмом, а потом применить unique, как это обьяснил Vyacheslav, т.к. в отсортированном векторе, все одинаковые элементы теперь действительно будут последовательными. |
Автор: Vyacheslav 24.1.2007, 19:57 | ||||||||
Логично ![]()
Можно задействовать и sort c unique
Добавлено @ 20:08 Кстати для понимания работы unique посмотрите, что получится, если просто вызвать unique без erase
|
Автор: ano360 24.1.2007, 20:18 |
segmentation_fault-Вы считаете это будет работать быстрее чем нов. функция? |
Автор: stmamont 24.1.2007, 22:35 |
ano360, быстрее чем твоя - точно. особенно при больших объемах данных. и уж точно - надежно |
Автор: Vyacheslav 25.1.2007, 10:31 | ||
Кстати в первом варианте сделал ошибку. Конечно же надо было
|