1 | |||||||||||
Удалить эквивалентные пары из вектора пар при помощи стандартных алгоритмов03.08.2011, 15:54. Показов 3980. Ответов 17
Метки нет (Все метки)
Что-то голова закипает, не могу сообразить. Есть вектор пар:
Мои соображения - использовать std::unuque() с таким предикатом:
Есть подозрение, что таким способом отсортировать нереально, может подскажите другое решение? Не по теме: P.S. повторюсь - используя STL, так я и сам могу написать))
0
|
03.08.2011, 15:54 | |
Ответы с готовыми решениями:
17
При помощи встроенных функций для заполнения стандартных матриц, получите следующую матрицу Вычисление функций, их сумм и произведений при помощи циклических алгоритмов При помощи алгоритмов кластеризации выявить нетипичное поведение пользователя в сети Модификация стандартных алгоритмов |
623 / 467 / 57
Регистрация: 28.01.2011
Сообщений: 605
|
||||||
03.08.2011, 16:20 | 2 | |||||
Я бы сначала прошёлся алгоритмом transform, чтобы все эквивалентные пары были переведены в одну и ту же форму, например, согласно условию p.first < p.second, а потом уже спокойно доделать дело с помощью sort и unique:
2
|
Freelance
2891 / 1826 / 356
Регистрация: 09.09.2010
Сообщений: 3,841
|
|
03.08.2011, 16:22 | 3 |
Kastaneda, Такая пара (3, 8) и (3, 8) не считаеться эквивалентной ?
0
|
03.08.2011, 16:32 [ТС] | 4 | |||||
Ma3a, ну да, об этом я как-то не подумал.
В общем-то мне данный вариант подойдет, однако было бы интересно посмотреть на другие решения Добавлено через 3 минуты Забыл упомянуть, у меня таких пар не будет (исключено алгоритмом получения этих пар). И еще, предикат из первого поста может выглядеть так:
0
|
155 / 155 / 44
Регистрация: 03.11.2010
Сообщений: 393
|
|||||||||||
03.08.2011, 17:25 | 5 | ||||||||||
Я так понял использовать функции с предикатами можно.
Чтобы эквивалентные пары оказались соседними в векторе можно использовать функцию std::stable_sort с предикатом:
поторопился, предикат вообще не нужен. Просто std::stable_sort; Вот мой вариант:
0
|
03.08.2011, 17:35 [ТС] | 6 |
Нет, он же не удаляет эквивалентные пары.
У меня создается вектор типа такого: (1,5), (2,4), (3, 3), (4, 2), (5, 1), только гораздо длиннее. Нужно оставить только (1,5), (2,4), (3, 3) (или (3, 3), (4, 2), (5, 1) - без разницы)
0
|
155 / 155 / 44
Регистрация: 03.11.2010
Сообщений: 393
|
|
03.08.2011, 17:44 | 7 |
Да, я невнимательно прочитал задание.
0
|
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
|
||||||
03.08.2011, 17:48 | 8 | |||||
Kastaneda, а одинаковые пары тоже надо удалять? Или одинаковых пар нет?
Добавлено через 3 минуты Попробуй для сортировки вот такой предикат. По-моему должен работать.
2
|
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
|
||||||
03.08.2011, 17:57 | 10 | |||||
Kastaneda, на самом деле я его не доделал. Если минимальные равны, то надо максимальные сравнить. Иначе не всегда будет работать.
Добавлено через 1 минуту Вот так:
0
|
03.08.2011, 18:00 [ТС] | 11 |
Ну в моем случае всегда, я же писал:
Т.е. существование пар, например, (1,5) и (1,6) исключенно. А так да, для более общего случая нужно конечно максимальные сравнивать тоже.
0
|
ниначмуроФ
851 / 535 / 110
Регистрация: 12.10.2009
Сообщений: 1,913
|
|
04.08.2011, 13:31 | 12 |
а как этот вектор(пар) вывести на экран при помощи copy?
0
|
Higher
|
||||||
04.08.2011, 13:55 | 13 | |||||
У меня при попытке скопировать его в ostream_iterator выдает километровую ошибку, хотя я даже переопределил << для пар =\
Можно с помощью for_each это сделать.
0
|
04.08.2011, 14:34 [ТС] | 14 | |||||
diagon, знак "=" в квадратных скобках необязателен (точнее вообще не нужен), т.к. нет захвата переменных из внешеней области видимости, значение передается аргументом в ф-ции.
Потому, что нет стандартного итератора std::ostream_iterator<std:air<int,int> > Тогда можно было так:
Не по теме: долбаные смайлы)
0
|
Заблокирован
|
||||||
04.08.2011, 16:57 | 15 | |||||
Интересно, а какова содержательная часть проблемы, которая привела к появлению этой подзадачи. Из чего вы образовывали пары и в связи с чем? Кстати сказать, у вас также будут удаляться и совпадающие значения пар { 3, 3 }, { 3, 3 }, так как они удовлетворяют вашему условию.
Что касается предиката сортировки, то он прост
0
|
Заблокирован
|
||||||||||||||||
05.08.2011, 16:38 | 17 | |||||||||||||||
Только я сделал по невнимательности ошибку, а меня никто не подправил! Поэтому решил возвратиться к этому вопросу. У класса
Тогда для сортировки предикат можно написать следующим образом
Вот сейчас логика будет правильная.
0
|
15.08.2011, 18:12 [ТС] | 18 | ||||||||||||||||||||
Сообщение было отмечено как решение
Решение
Знаю, что тема уже не актуальна, но я как раз сейчас сижу читаю книгу, и прочитал про эту проблему (в цитатах выше). Когда прочитал, то вспомнил, что недавно на форуме была затронута эта тема, а правильное решение так ни кто и не предложил, поэтому вот решил написать, думаю многим будет интересно)
В общем когда компилятор ищет нужную функцию, он пользуется т.н. ADL (Argument - Dependent Lookup - поиск с учетом аргуменов). Суть его заключается в следующем - функция ищется в том пространстве имен, к которому относятся ее аргументы. Если бы ADL не существовало, то вместо :
Теперь по поводу нашей проблемы, думаю все (и я в т.ч.) пробовали сделать так:
Поэтому правильно делать так:
Хотя добавление пользователем своих элементов в пространство имен std считается плохим тоном, но в данном случае это единственное (как пишет автор книги) разумное решение. Вот про ADL (выдержка из книги)
3
|
15.08.2011, 18:12 | |
15.08.2011, 18:12 | |
Помогаю со студенческими работами здесь
18
Как удалить данные из access при помощи php? Удалить из столбца пробелы при помощи функции Trim() Как удалить ячейку при помощи макроса в VBA? Провести операцию над множествами без использования стандартных алгоритмов Сортировка списка строк с использованием стандартных алгоритмов библиотеки STL При помощи двоичного поиска найти запись о конкретном сотруднике и удалить её Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |