Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
nofx
7 / 7 / 5
Регистрация: 28.10.2012
Сообщений: 134
Завершенные тесты: 4
1

Используя алгоритм сделать "реверс" элемента контейнера map

31.03.2017, 16:52. Просмотров 934. Ответов 7

C++
1
2
3
4
5
map<string, int> msi;
map["one"] = 1;
map["two"] = 2;
 
map<int, string> mis;
Можно ли используя какой-нибудь стандартный алгоритм из std заполнить msi ( mis[1] = "one", mis[2] = "two")

Пробывал вот так (std::transform

C++
1
2
3
4
5
6
pair<int, string> rotate_pair(const pair<string, int>& pair)
{
    return make_pair(pair.second, pair.first);  
}
 
std::transform(msi.begin(), msi.end(), mis.begin(), rotate_pair);
- но не получается, так объект-функция возращает временный объект, который стирается (поправьте если не так)

П.С
Интересуют именно алгоритмы, ибо без них можно так например:
C++
1
2
3
4
5
6
7
template<class T1, class T2> void rotate_map(const T1& map, T2& map2)
{
    for (auto pair : map)
    {
        map2[pair.second] = pair.first;
    }
}
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.03.2017, 16:52
Ответы с готовыми решениями:

C++, удаление элемента из списка "контейнера"
Всем привет, знаю что вы разбираетесь больше в программировании, я новичок еще новичок, объясните...

В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно"
В зависимости от времени года &quot;весна&quot;, &quot;лето&quot;, &quot;осень&quot;, &quot;зима&quot; определить погоду &quot;тепло&quot;,...

Из данной строки сделать новую строку, заменив в ней все слова: "один", "два", "три" и т.д на соответствующие цифры
Из данной строки сделать новую строку, заменив в ней все слова: &quot;один&quot;, &quot;два&quot;, &quot;три&quot; и т.д на...

Нужно сделать чтоб функция "int" выводила массив значений.достиг вывода 1-го элемента
Нужно сделать чтоб функция &quot;int&quot; выводила массив значений.достиг вывода 1-го элемента Текст,...

Для каждой строки найти слова, которые не имеют ни одного из букв: "l", "k", "r", "s" i "j"
Задано символьные строки. Строка состоит из нескольких слов (наборов символов), которые разделяются...

7
GbaLog-
Любитель чаепитий
3181 / 1484 / 469
Регистрация: 24.08.2014
Сообщений: 5,225
Записей в блоге: 1
Завершенные тесты: 2
31.03.2017, 16:58 2
Лучший ответ Сообщение было отмечено nofx как решение

Решение

Цитата Сообщение от nofx Посмотреть сообщение
поправьте если не так
просто надо куда-то вставлять элемент, там используется operator = для присвоения элемента, а у итератора std::map нет такого оператора для value_type, временные объекты тут не при чем.
http://rextester.com/PTK76812
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//g++  5.4.0
 
#include <iostream>
#include <map>
#include <algorithm>
 
int main()
{
    std::cout << "Hello, world!\n";
    
    std::map<std::string, int> m1
    {
        { "asd", 1 },
        { "qwe", 2 },
        { "three", 3 }
    };
    
    std::map<int, std::string> m2;
    
    std::transform(m1.begin(), m1.end(), std::inserter(m2, m2.end()), [] (auto p) { return std::make_pair(p.second, p.first); });
    
    for (const auto & it : m2)
    {
        std::cout << it.first << ' ' << it.second << "\n";
    }
}
0
nofx
7 / 7 / 5
Регистрация: 28.10.2012
Сообщений: 134
Завершенные тесты: 4
31.03.2017, 18:04  [ТС] 3
Цитата Сообщение от GbaLog- Посмотреть сообщение
а у итератора std::map нет такого оператора для value_type
- для pair определен operator=, этот же класс является итератором для map, верно?

utility.h
C++
1
2
3
4
5
6
7
8
9
10
template<class _Other1,
        class _Other2>
        _Myt& operator=(pair<_Other1, _Other2>&& _Right)
            _NOEXCEPT_OP((is_nothrow_assignable<_Ty1, _Other1&&>::value
                && is_nothrow_assignable<_Ty2, _Other2&&>::value))
        {   // assign from moved compatible pair
        first = _STD forward<_Other1>(_Right.first);
        second = _STD forward<_Other2>(_Right.second);
        return (*this);
        }
0
GbaLog-
Любитель чаепитий
3181 / 1484 / 469
Регистрация: 24.08.2014
Сообщений: 5,225
Записей в блоге: 1
Завершенные тесты: 2
31.03.2017, 19:16 4
Цитата Сообщение от nofx Посмотреть сообщение
для pair определен operator=, этот же класс является итератором для map, верно?
верно, но в std::map у итератора в value_type(std::pair) первый элемент константный, то есть std::pair<const Key, T>, как вы туда что-то запишете?
во вторых у std::map не выделяется память автоматически с инкрементом итератора, поэтому begin без end алгоритму можно передавать только тогда, когда вы уверены, что хватит места для этого.
я имею ввиду алгоритмы, которым надо начало контейнера указывать.
0
31.03.2017, 19:16
nofx
7 / 7 / 5
Регистрация: 28.10.2012
Сообщений: 134
Завершенные тесты: 4
31.03.2017, 22:33  [ТС] 5
Цитата Сообщение от GbaLog- Посмотреть сообщение
в std::map у итератора в value_type(std::pair) первый элемент константный
- да, константный. Получается нельзя писать в такой итератор? Видимо да.

Цитата Сообщение от GbaLog- Посмотреть сообщение
у std::map не выделяется память автоматически с инкрементом итератора
- только при вставке элемента автоматом. Зарезервировать нельзя как в векторе
0
Kastaneda
Jesus loves me
Эксперт С++
5042 / 3060 / 351
Регистрация: 12.12.2009
Сообщений: 7,740
Записей в блоге: 2
Завершенные тесты: 1
31.03.2017, 22:40 6
Шаблоны на этапе компиляции преобразовываются в типизированные классы, при этом генерируется новое имя для класса, часто имя зависит от типа. У тебя конечный тип получается (например) map_string_int, который содержит пары pair_string_int. А ты в него пытаешься записать пару pair_int_string, как будто у тебя контейнер имеет тип map_int_string. Но это 2 совершенно разных типа, которые ничего друг о друге на знают. Так понятней?
0
nofx
7 / 7 / 5
Регистрация: 28.10.2012
Сообщений: 134
Завершенные тесты: 4
31.03.2017, 23:45  [ТС] 7
Цитата Сообщение от Kastaneda Посмотреть сообщение
который содержит пары pair_string_int. А ты в него пытаешься записать пару pair_int_string, как будто у тебя контейнер имеет тип map_int_string
- где именно такое написано? функция rotate_pair возвращает "правильный" тип pair<int, string>. Я вроде бы понял проблему, но она же не в этом, а в том что алгоритм transform требует в своей реализации "output iterator"

Добавлено через 8 минут
C++
1
2
3
4
5
6
7
8
pair<int,string> reverse_map2(pair<const string, int>& it)
{
    return make_pair(it.second, it.first);
}
 
map<string, int> msi;
map<int, string> mis;
transform(msi.begin(), msi.end(), inserter(mis,mis.end()), reverse_map2);
0
Kastaneda
Jesus loves me
Эксперт С++
5042 / 3060 / 351
Регистрация: 12.12.2009
Сообщений: 7,740
Записей в блоге: 2
Завершенные тесты: 1
01.04.2017, 08:09 8
Цитата Сообщение от nofx Посмотреть сообщение
где именно такое написано?
я подумал, что в твоем коде в первом посте так делается, сейчас посмотрел, там имена map'ов mis и msi, не сразу отличишь, сбивает с толку.
0
01.04.2017, 08:09
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.04.2017, 08:09

В одномерном массиве состоящим из "N" вещественных элементов вычислить сумму элемента массива с не четными "N"
Помогите решить задачу плизз... В одномерном массиве состоящим из &quot;N&quot; вещественных элементов...

Создать список из целых чисел. После каждого элемента, равного "х" вставить элемент, равный "у"
Задача со стеком. Создать список из целых чисел. После каждого элемента,равного х вставить...

Реализовать классы "Воин", "Пехотинец", "Винтовка", "Матрос", "Кортик" (наследование)
Разработать программу с использованием наследования классов, реализующую классы: − воин; −...


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

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

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