155 / 137 / 46
Регистрация: 15.02.2010
Сообщений: 750
|
||||||||||||||||
1 | ||||||||||||||||
multimap (просмотр по ключу)01.05.2020, 11:48. Показов 15655. Ответов 30
Метки нет (Все метки)
Здравствуйте.
Имеется заполненный контейнер:
Конечно, можно тупо перебрать все пары и выести значения по ключу:
Можно ли сделать последовательный просмотр через поиск типа такого:
Или всё-таки без полного прохода по всем элементам не обойтись?
0
|
01.05.2020, 11:48 | |
Ответы с готовыми решениями:
30
Удаление записи по ключу в multimap Доступ к элементам multimap по ключу Multimap. Как получить кол-во элементов по ключу? Multimap. Ошибка operator+ not implemented in type multimap |
155 / 137 / 46
Регистрация: 15.02.2010
Сообщений: 750
|
|||||||||||
01.05.2020, 12:47 [ТС] | 3 | ||||||||||
Раз элементы отсортированны по ключу, значит в памяти они расположены последовательно?
Правильно я понимаю? А значит можно как-то применить вывод по принципу:
Добавлено через 36 минут Было бы здОрово написать что-то вместо звёздочек, чтобы заработало... Но, вот придумал такой "костыль" и всё работает.
0
|
фрилансер
5499 / 5095 / 1047
Регистрация: 11.10.2019
Сообщений: 13,346
|
||||||
01.05.2020, 13:01 | 4 | |||||
Сообщение было отмечено LVV как решение
Решение
в памяти - нет, структуру дерева можно глянуть тут
а вот итератором по ним пробежаться можно последовательно
1
|
155 / 137 / 46
Регистрация: 15.02.2010
Сообщений: 750
|
|
01.05.2020, 13:08 [ТС] | 5 |
Спасибо, Алексей1153, нижний пример - как раз то, что я искал.
0
|
Вездепух
11696 / 6375 / 1724
Регистрация: 18.10.2014
Сообщений: 16,070
|
||||||
01.05.2020, 17:08 | 6 | |||||
Если ваша задача все равно состоит в том, чтобы пробежаться по всем элементам диапазона, то есть линейный просмотр всех элементов вы будете делать в любом случае, то более разумным может оказаться вариант
с lower_bound для поиска начала диапазона, а затем - просто ручная проверка ключей, для распознания его конца
equal_range или найти только начало через lower_bound - трудно сказать сразу, но для таких тривиально сравниваемых ключей как int выгоднее может быть именно вариант с lower_bound , ибо equal_range выполняет двойной поиск.
1
|
155 / 137 / 46
Регистрация: 15.02.2010
Сообщений: 750
|
|
01.05.2020, 18:03 [ТС] | 7 |
TheCalligrapher, задача в том, чтобы пробежаться по всем элементам с заданным ключом.
0
|
Вездепух
11696 / 6375 / 1724
Регистрация: 18.10.2014
Сообщений: 16,070
|
|
01.05.2020, 18:18 | 8 |
О том и речь. "Элементы с заданным ключом" всегда образуют компактный диапазон в
multimap . Для "пробегания" вам нужно знать начало этого диапазона. А вот как определять конец этого диапазона - заранее через equal_range или самостоятельно путем проверки ключей в процессе "пробегания" - это уже вопрос отдельный. В вашем примере, возможно, лучше именно самостоятельно.
1
|
155 / 137 / 46
Регистрация: 15.02.2010
Сообщений: 750
|
|||||||||||
01.05.2020, 19:05 [ТС] | 9 | ||||||||||
Ну, так я уже нашел рабочее решение:
Ваш вариант, хоть и посимпатичнее будет, но Вы находите положение первого элемента не по ключу, а по его значению: mtp.lower_bound(5); Чтобы найти положение элемента с заданным ключом, нужно так: mtp.find(5); Вот так будет то, что мне и нужно было:
0
|
Вездепух
11696 / 6375 / 1724
Регистрация: 18.10.2014
Сообщений: 16,070
|
|
01.05.2020, 19:10 | 10 |
"Работать", то оно "работает", но это уже попахивает профанацией. Вы делаете двойной пробег по требуемым элементам: сначала внутри
count , затем еще раз, уже своим циклом.Зачем тратить усилия на двойной проход по диапазону, когда достаточно одного? Да, можно и так. Это косметика. Не понял. "По ключу" или "по значению ключа" - где вы тут увидели разницу? Вы несете чепуху. Методы lower_bound и find - совершенно одинаковы во всем, кроме поведения, когда ключ отсутствует в контейнере вообще.Это опять чепуха. Где вы тут увидели "пробегание до конца всего массива"? Посмотрите внимательнее на условие цикла.
0
|
155 / 137 / 46
Регистрация: 15.02.2010
Сообщений: 750
|
|
01.05.2020, 19:12 [ТС] | 11 |
Извините.
Я отредактировал сообщение. Там действитьельно говорил чепуху.
0
|
28 / 35 / 11
Регистрация: 11.06.2018
Сообщений: 145
|
|
01.05.2020, 19:13 | 12 |
0
|
155 / 137 / 46
Регистрация: 15.02.2010
Сообщений: 750
|
|
01.05.2020, 19:20 [ТС] | 13 |
На счет "по ключу" и "по значению" я, имел ввиду - по значению элемента массива multimap, ведь у него два значения: "ключ" и "собственно значение(я)", соответствующее ключу.
Ну, может в терминологии хромаю... Разве lower_bound не по значению находит итератор? Добавлено через 53 секунды Тогда встречный вопрос, а как найти итератор по значению (а не по ключу) элемента массива mvultimap?
0
|
Вездепух
11696 / 6375 / 1724
Регистрация: 18.10.2014
Сообщений: 16,070
|
|
01.05.2020, 19:24 | 14 |
Все поисковые методы контейнеров работают только по ключу.
Что такое "значение"? "Данные"? Только "вручную", путем полного просмотра. Например алгоритмом std::find_if .
1
|
155 / 137 / 46
Регистрация: 15.02.2010
Сообщений: 750
|
|
01.05.2020, 19:31 [ТС] | 15 |
Понял TheCalligrapher, спасибо.
Поясните еще одно. В чем различие между find и lower_bound? Что эффективнее для больших массивов? lower_bound, кажется, находит положение не по конкретному ключу, а "вблизи". То-есть, если ключи 2,3,8, то mtp.find(5) ничего не найдёт, а mtp.lower_bound(5) укажет на 3. Или опять бред несу? Добавлено через 1 минуту Хотя нет, написано "большее либо равное", то есть lower_bound укажет на 8
0
|
фрилансер
5499 / 5095 / 1047
Регистрация: 11.10.2019
Сообщений: 13,346
|
||||||
01.05.2020, 20:06 | 16 | |||||
Сообщение было отмечено LVV как решение
Решение
LVV, find вернёт либо итератор на найденный первый ключ, либо end()
lower_bound вернёт итератор на первый ключ в случае, если такие ключи вообще есть. Если ключей нет, он вернёт итератор на место, куда искомый ключ можно вставить, не нарушив при этом сортировку. То есть, в пАре lower_bound и upper_bound найдут, образно выражаясь, "локальные" begin и end этого ключа вот аналогичный пример на отсортированном векторе (на нём индексы удобнее отобразить)
b=5 e=6
1
|
155 / 137 / 46
Регистрация: 15.02.2010
Сообщений: 750
|
||||||
01.05.2020, 20:57 [ТС] | 17 | |||||
Тоесть, Алексей1153, чтобы пройтись по указанном ключу -5 контейнера multimap<int,int> mtp, нужно сделать так?
0
|
фрилансер
5499 / 5095 / 1047
Регистрация: 11.10.2019
Сообщений: 13,346
|
||||||
01.05.2020, 21:05 | 18 | |||||
логически - да, но это не рационально в плане быстродействия. Не нужно искать upper_bound каждую итерацию, достаточно просто проверять невыход за нужный ключ
1
|
155 / 137 / 46
Регистрация: 15.02.2010
Сообщений: 750
|
||||||
13.05.2020, 13:04 [ТС] | 19 | |||||
Ну, тогда вот так будет быстрее (вместо проверки двух условий в заголовке цикла присутствует одно условие)
0
|
фрилансер
5499 / 5095 / 1047
Регистрация: 11.10.2019
Сообщений: 13,346
|
|
13.05.2020, 14:39 | 20 |
LVV, mtp.upper_bound(key) - дополнительная тяжёлая операция поиска. А сравнение
it->first ==key - это пара тактов ЦП (так же, как иit != itt )То есть, у тебя то же самое плюс дополнительный upper_bound Но ко всему сказанному следует добавить, что все эти детали можно заранее так тщательно не выцеплять. Если во время тестирования нет тормозов, то можно оставить как есть. А вот если есть заметные тормоза, то тогда следует начинать искать тараканов. Но перед этим следует сделать профилирование, чтобы точно определить узкое место. А то начнёшь тратить время на оптимизацию того, что на скорость и не влияет
1
|
13.05.2020, 14:39 | |
13.05.2020, 14:39 | |
Помогаю со студенческими работами здесь
20
Сгруппировать элементы указанного массива по ключу и вернуть multimap ключей MyDictionary: сортировка по ключу, поиск значения по ключу, поиск ключа по значению MultiMap multimap сортировка в multimap Multimap зацикливается Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |