Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
2 / 2 / 0
Регистрация: 11.06.2019
Сообщений: 49
1

Не могу понять map, а конкретнее алгоритм разворота(поменять местами) ключа и значения

25.08.2019, 15:26. Показов 2615. Ответов 12
Метки нет (Все метки)

Дана функция:
C++
1
2
3
4
5
6
7
map<string, bool> BuildReversedMap(const map<bool, string>& m) {
  map<string, bool> result;
  for (const auto& item : m) {
    result[item.second] = item.first;//Я не понимаю конкретно это действие
  }
  return result;
}
Результатом будет, то что элементы map поменяются местами.
C++
1
result[item.second] = item.first;
Я понимаю эту строчку так. map result меняет значение на ключ. Но ведь ключ не меняет своё значение? Тогда как они меняются местами?

Прошу прощения, если вопрос глупый.
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.08.2019, 15:26
Ответы с готовыми решениями:

Не могу понять как поменять местами элементы массива
Задание:найдите наименьший элемент массива из десяти элементов и поменяйте его местами с последним...

Язык Си (поменять местами элементы массивов А и Б) не могу понять как
Вот моя прога #include &quot;stdafx.h&quot; #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;conio.h&gt;...

Понять алгоритм шифровки ключа
Помогите понять алгоритм шифровки ключа.... Смысл тот что я ввожу число(от 1000 до 999999) И...

Поменять местами ключ и значение в map
Ребят, как в map поменять местами ключ и значение? Мне из файла нужно считывать слова и потом...

12
488 / 285 / 128
Регистрация: 30.10.2018
Сообщений: 1,309
25.08.2019, 15:40 2
Цитата Сообщение от MungenHara Посмотреть сообщение
Но ведь ключ не меняет своё значение? Тогда как они меняются местами?
Ты не меняешь местами, ты просто создаешь новый ключ (который раньше был значениям), а старый ключ стал значениям нового ключа, объясню на пальцах

Было:

key1 - value1
key2 - valye2

Стало:

key1 - value1
key2 - valye2
value1 - key1
value2 - key2

Для реализации твоей задумки, тебе нужно удалить старый ключ и значения.
1
812 / 500 / 210
Регистрация: 19.01.2019
Сообщений: 1,196
25.08.2019, 15:49 3
http://www.cplusplus.com/refer... p/operator[]/
1
2 / 2 / 0
Регистрация: 11.06.2019
Сообщений: 49
25.08.2019, 16:22  [ТС] 4
Цитата Сообщение от kitsoRik Посмотреть сообщение
Стало:
key1 - value1
key2 - valye2
value1 - key1
value2 - key2
Да, я понимаю это. Был создан новый контейнер map result, его ключам были приданы значения "значений" map m.
key1 - value1
key2 - valye2
Но вот я не понял как было совершенно это действие.
value1 - key1
value2 - key2
Ведь там нет такой строчки:
C++
1
result[item.first] = item.second;
Добавлено через 59 секунд
Цитата Сообщение от nalbe666 Посмотреть сообщение
http://www.cplusplus.com/reference/map/map/operator[]/
А можете указать, где конкретно мне стоит прочесть? Так как я вроде прочёл, но вот ответов не нашёл.
0
488 / 285 / 128
Регистрация: 30.10.2018
Сообщений: 1,309
25.08.2019, 16:25 5
Цитата Сообщение от MungenHara Посмотреть сообщение
Ведь там нет такой строчки:
эта строка безсмысленна так как item.first - это ключ, а item.second - это значения, и по сути мы в ключ присваиваем то же значения, так что изменений от этого не будет. Ты путаешь немного first - ключ, second - значения
1
812 / 500 / 210
Регистрация: 19.01.2019
Сообщений: 1,196
25.08.2019, 16:33 6
Лучший ответ Сообщение было отмечено MungenHara как решение

Решение

Ссылка говорит, что оператор [] создаёт ключ, если его уже нету.
Цитата Сообщение от MungenHara Посмотреть сообщение
result[item.second]
Создаёт ключ(first) из [исходный map.second].
Цитата Сообщение от MungenHara Посмотреть сообщение
= item.first;//
Присваивает значение из исходный map.first в новый map.second.
1
2 / 2 / 0
Регистрация: 11.06.2019
Сообщений: 49
25.08.2019, 16:41  [ТС] 7
Я просто прочёл это:
mymap['d'] is
Был создан ключ d, но к нему не было создано никакого(заполненого) значения.

Цитата Сообщение от nalbe666 Посмотреть сообщение
Присваивает значение из исходный map.first в новый map.second.
Ну вроде понял, то есть это совершается автоматически, когда идёт работа с двумя map'ами? Автоматически присваивает значения к ключу в новый контейнер из старого?

Добавлено через 1 минуту
Цитата Сообщение от kitsoRik Посмотреть сообщение
эта строка безсмысленна так как item.first - это ключ, а item.second - это значения, и по сути мы в ключ присваиваем то же значения, так что изменений от этого не будет. Ты путаешь немного first - ключ, second - значения
Да я вроде понял. Просто не мог понять почему к новым ключам во втором контейнере были присвоены значения из первого контейнера без указанной на то операции. Но я так понял, что это совершается автоматически при присваивании ключей?
0
812 / 500 / 210
Регистрация: 19.01.2019
Сообщений: 1,196
25.08.2019, 16:55 8
Цитата Сообщение от MungenHara Посмотреть сообщение
result[item.second] = item.first;//Я не понимаю конкретно это действие
Ещё раз, вот строчка, которая:
Создаёт ключ(если его нет) оператором [], значение ключа = item.second(это value из исходной мапы).
Затем присваивает новое значение в пару к новому ключу из item.first(это key из исходной мапы).

newmap[key] = value; - Упрощенная форма для newmap.insert(key, value); Никакой волшебной автоматики.
1
2 / 2 / 0
Регистрация: 11.06.2019
Сообщений: 49
25.08.2019, 19:21  [ТС] 9
Цитата Сообщение от nalbe666 Посмотреть сообщение
Ещё раз, вот строчка, которая:
Создаёт ключ(если его нет) оператором [], значение ключа = item.second(это value из исходной мапы).
Затем присваивает новое значение в пару к новому ключу из item.first(это key из исходной мапы).
newmap[key] = value; - Упрощенная форма для newmap.insert(key, value); Никакой волшебной автоматики.
Ок. То есть эта строка одновременно подтягивает ключ и значение из 1го контейнера во второй? Верно?(сперва ключ, а потом и соответствующее значение). Вернее, в 2м сначала создаётся(копируется) ключ из 1го и сразу после этого подтягивается значение оттуда же?
0
Комп_Оратор)
Эксперт по математике/физике
8719 / 4428 / 598
Регистрация: 04.12.2011
Сообщений: 13,270
Записей в блоге: 16
26.08.2019, 01:28 10
MungenHara, карта map<string, bool> это нормально, а вот в map<bool, string> больше 2 пар key-value не поместится. Не видно смысла в таком контейнере.
1
2 / 2 / 0
Регистрация: 11.06.2019
Сообщений: 49
26.08.2019, 18:33  [ТС] 11
Цитата Сообщение от IGPIGP Посмотреть сообщение
карта map<string, bool> это нормально, а вот в map<bool, string> больше 2 пар key-value не поместится. Не видно смысла в таком контейнере.
Согласен. Плохой пример. Но мне был больше интересен сам принцип.
Это копирование с одного примера, который я не понял.
0
Комп_Оратор)
Эксперт по математике/физике
8719 / 4428 / 598
Регистрация: 04.12.2011
Сообщений: 13,270
Записей в блоге: 16
27.08.2019, 01:11 12
MungenHara, нельзя пытаться понять принцип на примере который в принципе не верен. Дело в том, как раз, что ключи - уникальны относительно предиката, который вы предложили мапе при её конструировании. По умолчанию это сравнение "<". Всё это, в частности означает, что ключи не могут повторяться, а значения могут. То есть, создание обратной мапы без потерь данных, возможно лишь если соответствие ключей значениям взаимно однозначно. И это в свою очередь значит, что значения удовлетворяют требованиям к ключам мапы. Они тоже должны быть сравнимы и уникальны. Или хотя бы сравнимы. Если уникальности не будет то часть пар просто потеряется, но обратная карта создастся. Это вряд ли то что нужно, кроме того случая, когда именно это и нужно. То есть, есть нюансы и вопрос требует уточнения.
Потому, что
Цитата Сообщение от MungenHara Посмотреть сообщение
Результатом будет, то что элементы map поменяются местами.
это не для всех пар, в общем случае, так как часть пар может исчезнуть. И это при том, что в прямой карте могло быть множество множеств одинаковых (по предикату) значений, соответствующих различным ключам.
1
2 / 2 / 0
Регистрация: 11.06.2019
Сообщений: 49
27.08.2019, 16:12  [ТС] 13
Цитата Сообщение от IGPIGP Посмотреть сообщение
это не для всех пар, в общем случае, так как часть пар может исчезнуть. И это при том, что в прямой карте могло быть множество множеств одинаковых (по предикату) значений, соответствующих различным ключам.
Спасибо, вроде появилось немного более ясности.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.08.2019, 16:12

В неупорядоченном списке поменять местами элементы с минимальным и максимальным значением ключа
Всем доброго времени суток) Столкнулся с проблемой...что я не могу поменять местами максимальный и...

Не могу понять алгоритм
Немогу понять алгоритм(закономерность) который потом нужно запоковать в for loop Задача: Есть...

Как поменять с помощью map значения ячейки, которую ввел пользователь?
Есть двухмерный массив char array = { {'1','2','3'}, {'4','5','6'}, ...

Не могу понять алгоритм задачи
Изучаю язык C, да и в обще программирование совсем не давно. Ни как не могу придумать нормального...

Не могу понять алгоритм решения
Дано натуральные числа n и m (50&lt;m&lt;n). Вычислить: static void Main(string args) { ...

не могу понять алгоритм решения ДУ
есть уравнение y'=(1+(y-1)/2x)^2 при раскрывании квадрата получается большие значения, не могу...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.