|
2 / 2 / 1
Регистрация: 09.07.2017
Сообщений: 18
|
||||||
Странное поведение set::erase при изменении компаратора17.07.2022, 21:48. Показов 1949. Ответов 6
Метки нет (Все метки)
Случайно столкнулся со странным поведением erase контейнера set. Вот такой код:
T.size = 2; T=2 1 T.size = 0; T= Т.е. при попытке удалить 2 не удаляется ничего, а при попытке удалить 1 удаляются оба значения. Почему не удаляет двойку, я еще могу понять. Он её просто не находит, т.к. выполняет двоичный поиск, а порядок значений поменялся. Но почему при команде удалить единицу удаляет двойку тоже? P.S. Если закомментировать строку inverse=1, всё работает нормально.
0
|
||||||
| 17.07.2022, 21:48 | |
|
Ответы с готовыми решениями:
6
Странное поведение при клонировании и изменении экземпляров префабов Странное поведение проекта при изменении требуемого Framework Странное поведение скорости ЦП при изменении настроек электропитания |
|
фрилансер
6445 / 5640 / 1128
Регистрация: 11.10.2019
Сообщений: 15,009
|
|
| 17.07.2022, 22:06 | |
|
georg21a, компаратор не должен меняться, он должен всегда работать одинаково - и во время вставки, и во время поиска, и во время удаления
а у тебя во время вставки a > b, а во время удаления вдруг a < b
0
|
|
|
2 / 2 / 1
Регистрация: 09.07.2017
Сообщений: 18
|
|
| 17.07.2022, 22:30 [ТС] | |
|
Алексей, так в этом и суть эксперимента. Вопрос возник из реальной программы, которую мне надо написать, и в которой компаратор зависит от параметра. Я хочу понять причину такого поведения, чтобы контролировать процесс.
Т.е. хотелось бы получить конкретный ответ, на уровне "глубинных процессов", почему при изменении компаратора наблюдается именно такое поведение.
0
|
|
|
фрилансер
6445 / 5640 / 1128
Регистрация: 11.10.2019
Сообщений: 15,009
|
||||||
| 17.07.2022, 22:48 | ||||||
|
georg21a, при смене поведения компаратора необходимо очистить контейнер и перенабить заново, чтобы сортировка и поиск осуществлялись одинаково
0
|
||||||
|
Неэпический
|
|||||
| 17.07.2022, 22:50 | |||||
|
Вы просто изменяете поведение компаратора.
0
|
|||||
|
2 / 2 / 1
Регистрация: 09.07.2017
Сообщений: 18
|
|
| 17.07.2022, 23:30 [ТС] | |
|
Я не понимаю. Контейнер не знает о том, что компаратор изменился. Контейнеру приходит команда удалить 1. Он начинает искать 1 с изменённым компаратором. Ищет методом двоичного поиска, но поскольку с новым компаратором порядок элементов нарушен, может и не найти. Если повезло и находит - ок, удаляет. Если не находит - значит не удаляет.
Но как он при команде "удалить 1" удаляет заодно и 2 ? Мне хочется в принципе понять, как такое может быть. Т.е. вопрос не "как исправить", а "почему так происходит".
0
|
|
|
Неэпический
|
|||||||
| 18.07.2022, 00:48 | |||||||
|
Но давайте посмотрим, что делает erase - удаляет элемент с эквивалентным ключом (не равным, а эквивалентным!). Эквивалентный ключ - это ключ, для которого !cmp(a, b) && !cmp(b, a) даст true.Допустим, деверо строится так, что в левую ветку складываются все элементы для которых компаратор (cmp(новое_значение, узел)) вернул false, а в правую - true. Элементы в правой ветке обзовем "меньшими", в левой - "не меньшими". Тогда берем ваш компаратор и строим дерево с ним ( inverse == 0, тут напутал, у вас знаки наоборот, но сути не меняет):
чисто гипотетически, поиск может быть устроен так: Находим первый эквивалентный элемент. Мы знаем, что в правой ветке дерева элементы "меньше" текущего, т.е. эквивалентных там нет. Эквивалентные ключи могут быть только в левой ветке. Как найти первый не эквивалентный ключ в левой ветке? Можно применить полную формулу, но зачем? У нас контейнер сформирован определенным образом. И достаточно найти первый у которого cmp(искомое, узел) даст true, ну или закончится контейнер.Давайте теперь выполним поиск по этому контейнеру с вашим компаратором при inverse == 0, т.е. с тем, с которым формировался контейнер (получившееся дерево есть выше).Начинаем смотреть дерево и сразу находим эквивалентный элемент (1). Ок. Пойдем в левую ветку искать не эквивалентный ключ cmp(1, 2), т.е. (1 < 2 == true), - нашли. Супер! Удаляем все узлы от (1) до (2).Теперь выполним поиск по тому же самому контейнеру с вашим компаратором при inverse == 1.Начинаем смотреть дерево и сразу находим эквивалентный элемент (1). Ок. Пойдем в левую ветку искать не эквивалентный ключ cmp(1, 2), т.е. (1 > 2 == false) - о, ключ эквивалентный предыдущему. Дальше контейнер закончился, удаляем (1) и (2).
0
|
|||||||
| 18.07.2022, 00:48 | |
|
Помогаю со студенческими работами здесь
7
Странное поведение при делегировании Странное поведение при буте Странное поведение ПК при старте Странное поведение при отладке Странное поведение при загрузке Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение.
И на уровне агентов добавится между грибами или бактериями взаимодействий.
До того я пробовал подход через многомерные массивы,. . .
|
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Сочетание глобально распределённой вычислительной мощности и инновационных. . .
|
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Налог на собак: https:/ / **********/ gallery/ V06K53e
Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf
Пост отсюда. . .
|
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop?
Ниже её машинный перевод.
После долгих разбирательств я наконец-то вернула себе. . .
|
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод
Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод.
Thinkpad X220 Tablet —. . .
|
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|