Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.52/140: Рейтинг темы: голосов - 140, средняя оценка - 4.52
0 / 0 / 0
Регистрация: 28.10.2017
Сообщений: 18

Как поменять ключ в map на другой, сохранив значение?

30.10.2017, 07:55. Показов 27444. Ответов 20

Студворк — интернет-сервис помощи студентам
Задача: нужно выборочно поменять любой ключ в словаре map, сохранив при этом его значение.
Например, есть пара ключ значение "111 555", вводим "111 222", получаем "222 555"
Вот решение, оно компилируется, но не работает. Не пойму что не так, подскажите.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<iostream>
#include<string>
#include<map>
using namespace std;
 
int main() {
    map<string, string> capital {{"111", "555"}, {"222", "666"}, {"333", "444"}};
    string str3, str2, tmp;
    cin >> str2 >> srt3;
    for (auto m : capital) {
        tmp = capital[str2];
        capital.erase(m.first);
        capital[str3] = tmp;
        cout << m.first << " " << m.second << endl;
    }
    return 0;
}
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.10.2017, 07:55
Ответы с готовыми решениями:

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

Как взять значение и ключ из Map?
мне нужно сравнить все значения в мэпе с определенным значением. мне нужно взять каждый ключ и каждое значение из него. как это сделать?...

Сортировка MAP по 2 параметрам (ключ-значение)
Доброго времени суток, застрял на части задачки где необходимо отсортировать Map по 2 параметрам, сортировка по значению прошла успешно,...

20
 Аватар для Nishen
1357 / 856 / 365
Регистрация: 26.02.2015
Сообщений: 3,814
30.10.2017, 08:03
C++
1
auto& m
Так попробуйте.
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
30.10.2017, 08:22
C++
1
2
3
4
5
6
auto it = capital.find(str2);
if (it != capital.end())
{
  capital[str3] = *it;
  capital.erase(it);
}
1
0 / 0 / 0
Регистрация: 28.10.2017
Сообщений: 18
30.10.2017, 08:49  [ТС]
не помогло. Ссылка вообще ничего не меняет. Второе решение у меня не компилируется, может нужно подключить какую-нибудь библиотеку?
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
30.10.2017, 09:20
Цитата Сообщение от sdntver Посмотреть сообщение
Второе решение у меня не компилируется
Текст ошибки покажи.
0
0 / 0 / 0
Регистрация: 28.10.2017
Сообщений: 18
30.10.2017, 09:36  [ТС]
Цитата Сообщение от nmcf Посмотреть сообщение
Текст ошибки покажи.
[Error] no match for 'operator=' (operand types are 'std::map<std::basic_string<char>, std::basic_string<char> >::mapped_type {aka std::basic_string<char>}' and 'std:air<const std::basic_string<char>, std::basic_string<char> >')

компилятор настроен на С++14
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
30.10.2017, 09:39
C++
1
capital[str3] = it->second;
1
0 / 0 / 0
Регистрация: 28.10.2017
Сообщений: 18
30.10.2017, 09:50  [ТС]
Спасибо все работает)
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
30.10.2017, 09:54
Цитата Сообщение от sdntver Посмотреть сообщение
Второе решение у меня не компилируется
перепутал контейнеры.
*it -> it->second.

Добавлено через 22 секунды
а, уже написали даже.
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
30.10.2017, 14:59
sdntver, нельзя изменить значение ключа. Только добавить новую запись и удалить старую.
0
0 / 0 / 0
Регистрация: 28.10.2017
Сообщений: 18
30.10.2017, 15:07  [ТС]
Цитата Сообщение от GbaLog- Посмотреть сообщение
перепутал контейнеры.
*it -> it->second.

Добавлено через 22 секунды
а, уже написали даже.
Сейчас код выглядит так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<iostream>
#include<string>
#include<map>
using namespace std;
 
int main() {
    map<string, string> capital {{"111", "555"}, {"222", "666"}, {"333", "444"}};
    string str3, str2, tmp;
    cin >> str2 >> str3;
    auto it = capital.find(str2);
    if (it != capital.end())
    {
      capital[str3] = it->second;
      capital.erase(it);
    }
    cout << 
    return 0;
}
Нужно добавить условие, что бы str3 не был равен ни одному ключу, в противном случае ничего не делать. И скажите пожалуйста it != capital.end() что значит данное условие в словах.
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
30.10.2017, 15:14
C++17
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <map>
#include <string>
 
int main()
{
    std::map<std::string, std::string> capital { {"111", "555"}, {"222", "666"}, {"333", "444"} };
    const std::string from = "111", to = "222";
    auto it = capital.find(from);
    if (it != capital.cend()) // нашли запись с ключом from
        if (capital.try_emplace(to, it->second).second) // вышло вставить запись с ключом to (такой не было)
            capital.erase(it); // удаляем предыдущую запись
    
    for (const auto &p : capital)
        std::cout << p.first << " " << p.second << std::endl;
}
http://coliru.stacked-crooked.... 5b61953f3e
0
0 / 0 / 0
Регистрация: 28.10.2017
Сообщений: 18
30.10.2017, 15:43  [ТС]
к сожалению у меня не включается С++17, работает только на C++14. Использую DEV C++ 5.11 (вроде как последняя версия) и соответственно строка 11 вышибает ошибку:
[Error] 'class std::map<std::basic_string<char>, std::basic_string<char> >' has no member named 'try_emplace'
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
30.10.2017, 15:46
А чем предыдущий вариант-то плох?
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
30.10.2017, 15:51
Лучший ответ Сообщение было отмечено sdntver как решение

Решение

Вариант С++11
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <map>
#include <string>
 
int main()
{
    std::map<std::string, std::string> capital { {"111", "555"}, {"222", "666"}, {"333", "444"} };
    const std::string from = "111", to = "222";
    auto it = capital.find(from);
    if (it != capital.cend()) // нашли запись с ключом from
    {
        if (capital.find(to) == capital.cend()) // такой записи не было
        {
            capital[to] = it->second;
            capital.erase(it); // удаляем предыдущую запись
        }
    }
 
    for (const auto &p : capital)
        std::cout << p.first << " " << p.second << std::endl;
}
1
0 / 0 / 0
Регистрация: 28.10.2017
Сообщений: 18
30.10.2017, 16:38  [ТС]
Спасибо, теперь все работает корректно.
0
 Аватар для animefan
119 / 9 / 2
Регистрация: 06.09.2017
Сообщений: 82
30.10.2017, 19:52
Когда видишь
Цитата Сообщение от sdntver Посмотреть сообщение
нужно выборочно поменять любой ключ в словаре map, сохранив при этом его значение.
и находишь на странице ответ с
Цитата Сообщение от MrGluck Посмотреть сообщение
C++17
думаешь: "ага! Вот сейчас нам продемонстрируют node handles!" (про инициализаторы в if и structured bindings я и не говорю, это ожидается вне зависимости от решаемой задачи).
Но вместо этого видишь какой-то цирк с find-erase.

Вот нечто более похожее на C++17:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <map>
#include <string>
 
int main()
{
    std::map<std::string, std::string> capital { {"111", "555"}, {"222", "666"}, {"333", "444"} };
    const std::string from = "111", to = "222";
    
    if (auto nh = capital.extract(from); nh) {
        nh.key() = to;
        capital.insert(std::move(nh));
    }
    
    for (const auto& [key, value] : capital)
        std::cout << key << " " << value << std::endl;
}
Добавлено через 3 минуты
https://wandbox.org/permlink/EK7E3IoODwo4DWKY
1
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
30.10.2017, 20:00
animefan, да, так выглядит лучше.
+
1
 Аватар для animefan
119 / 9 / 2
Регистрация: 06.09.2017
Сообщений: 82
31.10.2017, 02:20
MrGluck, чем же лучше, если оно не работает как надо? Не вставляет, если уже есть элемент с таким ключом. Должно быть
C++
1
2
3
4
5
    if (auto nh = capital.extract(from); nh) {
        nh.key() = to;
        capital.erase(to);
        capital.insert(std::move(nh));
    }
0
0 / 0 / 0
Регистрация: 28.10.2017
Сообщений: 18
31.10.2017, 07:15  [ТС]
animefan, спасибо, ваше решение соответствует моему заданию, но я его не совсем корректно задал в самом начале, если задать 111 222 ничего не должно произойти, потому что ключ 222 уже есть в словаре, а менять нужно только ключ 111, то есть программа должна выдать ошибку и ничего не делать со словарем.
Я уже нашел решение благодаря решениюMrGluck, спасибо всем кто помог. Вот моё готовое решение, это лишь кусочек из задания, здесь я его немного упростил, что бы понять как работают операторы map. Если не трудно дайте ссылку на нормальный учебный материал по словарю map.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if (str1 == "RENAME") {
            cin >> str2 >> str3;
            const string from = str2, to = str3;
            auto it = capital.find(from);
            if (it != capital.cend()) // нашли запись с ключом from
            {
                if (capital.find(to) == capital.cend()) // такой записи не было
                {
                    capital[to] = it->second;
                    capital.erase(it); // удаляем предыдущую запись
                    result.push_back("Country " + str2 + " with capital capital has been renamed to " + str3);
                }   
                else result.push_back("Incorrect rename, skip");
            }   
            else result.push_back("Incorrect rename, skip");
        }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
31.10.2017, 07:15
Помогаю со студенческими работами здесь

Контейнер Map. Использование класса как ключ
class A{ int X;}; class B{ public: int y;}; int main() { A objA; B objB; map&lt;A,B&gt; m; m.y=1; //kak? ...

Структура как ключ map, возможно ли как-то реализовать operator []
Возможно бред, но всё же. Реализовать сам ключ не сложно, вот код: class cKey { public: cKey(){} cKey(TIMER_ID...

Как перенести образ Lubuntu из одного компа на другой сохранив все настройки
Всем добрый день. Возможно вопрос банальный и глупый, но надеюсь на ваше понимание. Суть такая, нам на предприятие закупили 30 новеньких...

std::map find. Получить ключ(элемент) и как записать все данные при объявлений?
Вопрос первый: как получить ключ контейнера map по данным? например: // id, name std::map&lt;int, string&gt; BookMap; BookMap...

Как в реестре поменять ключ Win 10
Здравствуйте уважаемые форумчане. Скажите пожалуйста какой программой или руками в реестре поменять ключ на свой ? дело в том, что поменял...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
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-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru