8 / 8 / 5
Регистрация: 28.10.2012
Сообщений: 135
1

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

31.03.2017, 16:52. Показов 2280. Ответов 7

Author24 — интернет-сервис помощи студентам
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)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.03.2017, 16:52
Ответы с готовыми решениями:

Из каждого элемента контейнера map вычесть среднее арифметическое контейнера
Контейнер map, тип элементов Int 3.Из каждого элемента вычесть среднее арифметическое контейнера

Map : как по номеру элемента получить сам элемент контейнера?
Додумался только до такого: int n = 2; std::map&lt; String, String &gt; MASS; std::map&lt;String,...

Найти элементы ключами контейнера map из заданного диапазона и удалить их из контейнера
Контейнер map, тип элементов Int 2.Найти элементы ключами из заданного диапазона и удалить их из...

Найти среднее арифметическое контейнера map и добавить его на заданную позицию контейнера
Контейнер map, тип элементов Int 1.Найти среднее арифметическое и добавить его на заданную...

Используя алгоритм search() определить значения из контейнера Student попавших в контейнер Person
Есть следующее задание: объявить два контейнера типа vector, в одном из которых находятся объекты...

7
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
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
8 / 8 / 5
Регистрация: 28.10.2012
Сообщений: 135
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
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
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
8 / 8 / 5
Регистрация: 28.10.2012
Сообщений: 135
31.03.2017, 22:33  [ТС] 5
Цитата Сообщение от GbaLog- Посмотреть сообщение
в std::map у итератора в value_type(std::pair) первый элемент константный
- да, константный. Получается нельзя писать в такой итератор? Видимо да.

Цитата Сообщение от GbaLog- Посмотреть сообщение
у std::map не выделяется память автоматически с инкрементом итератора
- только при вставке элемента автоматом. Зарезервировать нельзя как в векторе
0
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,113
Записей в блоге: 2
31.03.2017, 22:40 6
Шаблоны на этапе компиляции преобразовываются в типизированные классы, при этом генерируется новое имя для класса, часто имя зависит от типа. У тебя конечный тип получается (например) map_string_int, который содержит пары pair_string_int. А ты в него пытаешься записать пару pair_int_string, как будто у тебя контейнер имеет тип map_int_string. Но это 2 совершенно разных типа, которые ничего друг о друге на знают. Так понятней?
0
8 / 8 / 5
Регистрация: 28.10.2012
Сообщений: 135
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
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,113
Записей в блоге: 2
01.04.2017, 08:09 8
Цитата Сообщение от nofx Посмотреть сообщение
где именно такое написано?
я подумал, что в твоем коде в первом посте так делается, сейчас посмотрел, там имена map'ов mis и msi, не сразу отличишь, сбивает с толку.
0
01.04.2017, 08:09
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.04.2017, 08:09
Помогаю со студенческими работами здесь

Недопонимание контейнера map
В программе наша цель поменять местами числа с происходящим действием, но сам лично не понял ...

Использование контейнера map
Доброе утро) Никак не пойму как пользоваться контейнером map и зачем он, вообще, нужен?! Скажем...

Вывод контейнера map
Подскажите пожалуйста как вывести на экран значение карты. Программа такая: надо создать карту, где...

Использование контейнера map
строка 3 → Как определяется объект класи map? void ZLab10::mapa() { map&lt;char,double&gt;...

Удалить элементы из контейнера map
#include &lt;iostream&gt; #include &lt;map&gt; using namespace std; int main() { map&lt;int, int&gt; map1; ...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru