Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
-10 / 2 / 1
Регистрация: 08.01.2015
Сообщений: 325
1

Std::unordered_multimap<std::string, std::unordered_multimap<int, int>>

14.07.2018, 19:02. Показов 2278. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Приветствую. Интересует вопрос, как можно обращаться к контейнеру?

Хотелось бы по map["word"][0], но так не работает. Каким образом можно это сделать?
C++
1
2
3
4
std::unordered_multimap<std::string, std::unordered_multimap<int, int>> map;
std::unordered_multimap<int, int> a;
a.emplace(1, 2);
unordered_multi_map.emplace("word", a);
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.07.2018, 19:02
Ответы с готовыми решениями:

Std::unordered_multimap<std::string, int> map
Приветствую. Как можно получить только &quot;уникальный&quot; ключ в контейнере? ...

Быстродействие std::unordered_map vs. std::unordered_multimap
Привет, скажите пожалуйста, есть какие-либо существенные просадки по скорости исполнения программы,...

На основе исходного std::vector<std::string> содержащего числа, создать std::vector<int> с этими же числами
подскажите есть вот такая задача. Есть список . Создать второй список, в котором будут все эти же...

Странная ошибка: [Error] no match for call to '(std::string {aka std::basic_string<char>}) (int&)'
У меня появляется проблема при компиляции сей программы: #include &lt;iostream&gt; #include &lt;string&gt;...

8
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
14.07.2018, 19:13 2
Цитата Сообщение от Kenny_Dalglish Посмотреть сообщение
Интересует вопрос, как можно обращаться к контейнеру?
unordered_multimap предназначен для того, чтобы одному ключу соответствовало несколько значений. Соответственно используется find https://en.cppreference.com/w/... timap/find , причём с перебором по итератору всех добавленных значений с данным ключом.

Если на один ключ будет только одно значение, то используй https://en.cppreference.com/w/... rdered_map
0
-10 / 2 / 1
Регистрация: 08.01.2015
Сообщений: 325
14.07.2018, 19:30  [ТС] 3
TRam_, Нужно, чтобы соответствовало несколько значений. unordered_map - не подходит.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <unordered_map>
#include <algorithm>
#include <string>
 
int main()
{
    std::unordered_map<std::string, std::unordered_map<int, int>> map;
    std::unordered_multimap<int, int> a;
    a.emplace(1, 2);
    map.emplace("word", a);
 
    auto search_word = map.equal_range("word1");
 
    auto first = search_word.first;
 
    std::cout << first->second;
    system("pause");
    return 0;
}
Я правильно, понимаю, что в first->second будет обращение к вложенному контейнеру? Тогда как перегрузить оператор << на вывод?
Миниатюры
Std::unordered_multimap<std::string, std::unordered_multimap<int, int>>  
0
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
14.07.2018, 20:19 4
Лучший ответ Сообщение было отмечено Kenny_Dalglish как решение

Решение

Цитата Сообщение от Kenny_Dalglish Посмотреть сообщение
Я правильно, понимаю, что в first->second будет обращение к вложенному контейнеру
Неправильно.

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 <string>
#include <unordered_map>
 
int main()
{
    std::unordered_multimap<std::string, std::unordered_multimap<int, int>> map;
    std::unordered_multimap<int, int> a;
    a.emplace(1, 2);
    map.emplace("word", a);
    
    auto search_word = map.equal_range("word");
    for(auto it = search_word.first; it != search_word.second; ++it)
    {  
        std::cout << "key_string " << it->first << std::endl;
        
        auto search_value = it->second.equal_range(1);      
        for(auto it2 = search_value.first; it2 != search_value.second; ++it2)
            std::cout << "key_int " << it2->first<< " value " << it2->second << std::endl;
    }
}
1
-10 / 2 / 1
Регистрация: 08.01.2015
Сообщений: 325
14.07.2018, 21:22  [ТС] 5
TRam_, Хмм. А, без equal_range можно сделать перебор во вложенном итераторе?
0
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
14.07.2018, 21:28 6
Цитата Сообщение от Kenny_Dalglish Посмотреть сообщение
А, без equal_range можно сделать перебор во вложенном итераторе?
А чем такой способ не устраивает? Вроде бы всё логично - на каждый строковый ключ приходится несколько числовых ключей, на каждый из которых приходится по несколько значений. Вот и нужно будет делать 2 уровня переборов, чтобы получить все значения, соответствующие данной паре ключей.
0
-10 / 2 / 1
Регистрация: 08.01.2015
Сообщений: 325
14.07.2018, 21:31  [ТС] 7
TRam_, Ну так не сделать полный перебор контейнера. Решил. Может, кому надо будет. Спасибо Вам огромное.

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
#include <iostream>
#include <string>
#include <unordered_map>
 
int main()
{
    std::unordered_multimap<std::string, std::unordered_multimap<int, int>> map;
    std::unordered_multimap<int, int> a;
    a.emplace(1, 2);
    a.emplace(555, 777);
    map.emplace("word", a);
 
    auto search_word = map.equal_range("word");
    for (auto it = search_word.first; it != search_word.second; ++it)
    {
        std::cout << "key_string " << it->first << std::endl;
 
        auto search_value = it->second;
        for (auto it2 = search_value.begin(); it2 != search_value.end(); ++it2)
        {
            std::cout << "key_int " << it2->first << " value " << it2->second << std::endl;
        }
    }
    system("pause");
}
0
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
14.07.2018, 21:42 8
Если же нужно "хотя бы какое-нибудь значение" для двух ключей, то можно сделать так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <string>
#include <unordered_map>
 
int main()
{
    std::unordered_multimap<std::string, std::unordered_multimap<int, int>> map;
    std::unordered_multimap<int, int> a;
    a.emplace(1, 2);
    map.emplace("word", a);
    
    
    auto elem = map.find("word");
    if(elem != map.end())
    { 
        auto elem2 = elem->second.find(1);
        if(elem2 != elem->second.end())
            std::cout << " fount value " << elem2->second;     
    }
}
(ну или комбинируя, для каждого из уровней)

Добавлено через 8 минут
Цитата Сообщение от Kenny_Dalglish Посмотреть сообщение
Ну так не сделать полный перебор контейнера
Пошаговый перебор данного контейнера по сложности, конечно, будет аналогичен unordered_map::equal_range, так что использование того или другого мало отразится на производительности. Но если б речь шла о контейнере с упорядоченными элементами (например std::multimap), то выбрал бы именно ::equal_range (он был бы быстрее).
0
4264 / 3323 / 925
Регистрация: 25.03.2012
Сообщений: 12,519
Записей в блоге: 1
15.07.2018, 13:44 9
Цитата Сообщение от Kenny_Dalglish Посмотреть сообщение
Хотелось бы по map["word"][0]
это принцип работы простой двумерной мапы, а не мультимапы.
Я правильно понимаю, что по каждому из ключей должно храниться несколько чисел int
Но для того что бы и различать ты зачем-то ввёл вложенность у двух мап как у двумерного массива? ["word"][0] ["word"][1] ["word"][2]
Вообще-то, что бы просто хранить много чисел по индексу "word" самой по себе unordered_multimap без добавок

Добавлено через 46 минут
достаточно
0
15.07.2018, 13:44
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.07.2018, 13:44
Помогаю со студенческими работами здесь

ошибка error: cannot convert 'std::string {aka std::basic_string<char>}' to 'std::string* {aka std::basic_stri
на вод поступают 2 строки типа string. определить количество вхождений строки 2 в строку 1 ошибка...

Std::vector<std::pair<std::vector<int>::iterator, std::vector<int>::iterator>
Вопрос по вектору. Допустим есть вектор, std::vector&lt;int&gt; vec; на каком - то этапе заполнения я...

int to std::string
Не подскажите как перевести int в std::string

Расстановка девяти чисел (Turbo C) Выводит ошибку using Matrix = std::array<std::array<int, 3>, 3>; и bool NextSet
#include &lt;iostream&gt; #include &lt;array&gt; using Matrix = std::array&lt;std::array&lt;int, 3&gt;, 3&gt;; //...


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

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