|
13 / 11 / 3
Регистрация: 22.11.2013
Сообщений: 127
|
|||||||||||
std::unique ведет себя не так как ожидалось12.08.2021, 17:30. Показов 2383. Ответов 9
Метки нет (Все метки)
win 10, visual studio 19.
У меня есть два контейнера с указателями на std::string
Содержимое контейнера до вызова std::unique Содержимое контейнера после вызова std::unique Откуда там взялось по два элемента с одинаковым адресом? Что я делаю не так? От мой код
0
|
|||||||||||
| 12.08.2021, 17:30 | |
|
Ответы с готовыми решениями:
9
|
|
"C with Classes"
|
||
| 12.08.2021, 18:11 | ||
|
Relative order of the elements that remain is preserved and the physical size of the container is unchanged. Iterators in [r, last) (if any), where r is the return value, are still dereferenceable, but the elements themselves have unspecified values. A call to unique is typically followed by a call to a container's erase member function, which erases the unspecified values and reduces the physical size of the container to match its new logical size. Полезная ссылка.
0
|
||
|
Вездепух
13201 / 6836 / 1822
Регистрация: 18.10.2014
Сообщений: 17,294
|
||
| 12.08.2021, 18:34 | ||
std::unique не обещает и никогда не обещала вам, что она будет выполнять некое разделение и переупорядочение элементов на "уникальные" и "не уникальные". std::unique не выполняет переупорядочения элементов с сохранением уникальности исходных значений. std::unique просто тупо копирует/перемещает содержимое уникальных элементов вперед - к началу списка - не беспокоясь при этом о том, чтобы куда-то сохранить старое значение из начала списка. Все. При этом запросто могут возникнуть дубликаты каких-то значений, а какие-то значения могут пропасть. Вот здесь вы можете посмотреть "возможные реализации" std::unique: https://en.cppreference.com/w/cpp/algorithm/uniqueНапример, если вы на вход std::unique дадите 1 1 2, то на выходе вы получите 1 2 2. Как видите, одна из 1 пропала, а 2 - размножилась. std::unique не беспокоится о том, чтобы сохранить исходный "состав" вашей последовательности неизменным. Такой задачи перед std::unique не ставится.
0
|
||
|
13 / 11 / 3
Регистрация: 22.11.2013
Сообщений: 127
|
||
| 12.08.2021, 18:41 [ТС] | ||
|
Содержимое контейнера после вызова std::unique В даном примере std::unique возвращает итератор на элемент шестой элемент коллекции (deq[5]). Начиная с этого элемента - это пошли дубли. Так? Я начинаю удалять дубли, но так как это указатели - мне нужно сразу перед удалением их с контейнера освободить память на которую они указывают чтобы небыло утечки памяти. Но обратите внимание что теперь, после работы std::unique, в элементов deq[3] и deq[6] почему-то один и тот же адрес. И когда я освобождаю память для дубля( deq[6]) - я этим самим удаляю и нужную информацию (не дубля) из deq[3]
0
|
||
|
Вездепух
13201 / 6836 / 1822
Регистрация: 18.10.2014
Сообщений: 17,294
|
|||
| 12.08.2021, 18:48 | |||
deq[3] = deq[6] - и вот готовы одинаковые значения указателей. Почему вас это удивляет?Можно вообще вычеркнуть мои объяснения из предыдущего сообщения, а просто формально запомнить, что содержимое диапазона [result, deq.end()) после выполнения std::unique неспецифицированно. Ни о каком применении delete *it к этому диапазону не может быть и речи вообще.
1
|
|||
|
13 / 11 / 3
Регистрация: 22.11.2013
Сообщений: 127
|
||
| 12.08.2021, 18:51 [ТС] | ||
|
0
|
||
|
Вездепух
13201 / 6836 / 1822
Регистрация: 18.10.2014
Сообщений: 17,294
|
||
| 12.08.2021, 20:26 | ||
|
0
|
||
|
зомбяк
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
|
||||||
| 13.08.2021, 12:03 | ||||||
|
Bino321, переделал на умные указатели:
0
|
||||||
|
|
|||||||||||||||||||||||
| 13.08.2021, 13:12 | |||||||||||||||||||||||
|
Если дубли дублируют не только значения по указателю, но и сами указываемые адреса естесственно будут проблемы. Вы освобождаете память, на которую ссылаются ещё несколько указателей. Не надо так. Добавлено через 1 минуту Добавлено через 4 минуты Я как вариант предлагаю делать в 2 прохода. Первый std::unique перемещает в хвост элементы с повторяющимися адресами
0
|
|||||||||||||||||||||||
|
Вездепух
13201 / 6836 / 1822
Регистрация: 18.10.2014
Сообщений: 17,294
|
|||
| 13.08.2021, 18:52 | |||
Тут, как говорится, хоть кол на голове теши.... std::unique никогда ничего в хвост не перемещает, как было ясно объяснено выше.Добавлено через 3 минуты std::shared_ptr. Все указатели уникальны и с задачей прекрасно справляется std::unique_ptr.
0
|
|||
| 13.08.2021, 18:52 | |
|
Помогаю со студенческими работами здесь
10
Нюансы работы с оператором ветвления if else: почему программа ведёт себя не так, как ожидается? Нюансы работы с оператором ветвления if else: почему программа ведёт себя не так, как ожидается? Почему IE так себя ведет? Почему TButton ведет себя не так Почему DHCP ведет себя так? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
|
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . .
а удачный момент так и не приходит.
|
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица.
Задача: зафиксировать три левых колонки в отчете.
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
/ / . . .
|
Настройки VS Code
Loafer 13.04.2026
{
"cmake. configureOnOpen": false,
"diffEditor. ignoreTrimWhitespace": true,
"editor. guides. bracketPairs": "active",
"extensions. ignoreRecommendations": true,
. . .
|
|
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2.
Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива.
Было так:. . .
|
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2.
Задача: реализовать контроль корректности заполнения дат назначения. . .
|
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html
Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
|
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2.
Задача №1: при указании работ (справочник РаботыПоРемонтуСпецтехники),. . .
|