Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.55/40: Рейтинг темы: голосов - 40, средняя оценка - 4.55
9 / 9 / 0
Регистрация: 22.12.2017
Сообщений: 283
1

Вывод элементов map <string,vector<string>>

11.02.2019, 14:25. Показов 7533. Ответов 12
Метки нет (Все метки)

Доброго времени суток.
Как можно вывести массив
C++
1
map <string,vector<string>> mp
?
Могу только предположить, что нужно как-то модифицировать "el.second", но никаких идей нет.
C++
1
2
    for (const auto &el : mp)
    cout << el.first << " -> " << el.second << endl;
1

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

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.02.2019, 14:25
Ответы с готовыми решениями:

Разделить vector<string> на два vector<string>
У меня есть vector&lt;string&gt; line_from_file; line_from_file.resize(N); N-некое число Когда я...

Не могу разобраться как обновить в std::map<std::string, вектор_структур>
Не могу разобраться как обновить вектор структур после его добавления в map без удаления и...

Map c++ вывод на консоль по ключу
Нужна помощь! У меня есть контейнер : map &lt;string, int&gt; m1 = { { &quot;wq&quot;, 1 }, { &quot;etr&quot;, 2 }, {...

Конструирование string из stringstream
Я уже довольно долгое время ломаю голову над вот таким вопросом конструирования строки из...

12
Jesus loves me
Эксперт С++
5191 / 3158 / 356
Регистрация: 12.12.2009
Сообщений: 7,983
Записей в блоге: 2
11.02.2019, 14:43 2
Лучший ответ Сообщение было отмечено Encrypted1010 как решение

Решение

C++
1
2
3
4
5
6
7
    for (const auto &el : mp) {
        cout << el.first << " -> [";
        for (const auto& s : el.second) {
            cout << s << (&s == &el.second.back() ? "]" : ", ");
        } 
        cout << endl;
    }
1
9 / 9 / 0
Регистрация: 22.12.2017
Сообщений: 283
11.02.2019, 14:52  [ТС] 3
Вылетает ошибка при компиляции
C++
1
Ошибка    C2664   "std::pair<const _Kty,_Ty>::pair(std::pair<const _Kty,_Ty> &&)": невозможно преобразовать аргумент 2 из "_Ty" в "const _Ty2 &"    Analizer    c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.16.27023\include\xmemory0    881
Добавлено через 5 минут
Kastaneda, что-то не так.
0
Jesus loves me
Эксперт С++
5191 / 3158 / 356
Регистрация: 12.12.2009
Сообщений: 7,983
Записей в блоге: 2
11.02.2019, 15:10 4
Покажи код
0
567 / 406 / 132
Регистрация: 22.11.2017
Сообщений: 1,054
11.02.2019, 15:31 5
Encrypted1010, привет!
Предлагаю ёлочку перегрузить. Потом в коде, если понадобится вывод map<string,vector<string>> mp. Просто напишем так cout << mp.
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
27
28
29
30
31
32
33
34
35
#include <iostream>
#include <string>
#include <vector>
#include <map>
 
using namespace std;
 
template<class T, class E>
ostream& operator << (ostream& os, const map <T, vector<E>> &mp)
{
    for (const auto &pr : mp)
    {
        os << pr.first << " -> [ ";
        for (const auto &value : pr.second)
        {
            os << value << (value != pr.second.back() ? ", " : "");
        }
        os << "]" << endl;
    }
    return os;
}
 
int main()
{
    system("color 0A");
 
    map <string, vector<string>> mp;
    mp.insert({ "Str1", { "Uder1.1", "Under1.2" } });
    mp.insert({ "Str2", { "Uder2.1", "Under2.2", "Uder2.3", "Under2.4" } });
    mp.insert({ "Str3", { "s1", "s2", "s3", "s4" } });
    cout << mp;
 
    system("pause");
    return 0;
}
2
Миниатюры
Вывод элементов map <string,vector<string>>   Вывод элементов map <string,vector<string>>  
Jesus loves me
Эксперт С++
5191 / 3158 / 356
Регистрация: 12.12.2009
Сообщений: 7,983
Записей в блоге: 2
11.02.2019, 16:06 6
SomniPhobia,
C++
1
 mp.insert({ "Str1", { "Uder1.1", "Uder1.1", "Uder1.1", "Under1.2", "Uder1.1" } });
чет не красиво

Вывод элементов map <string,vector<string>>
1
567 / 406 / 132
Регистрация: 22.11.2017
Сообщений: 1,054
11.02.2019, 16:12 7
Kastaneda, у меня красиво выводит. В чём причина?
1
Jesus loves me
Эксперт С++
5191 / 3158 / 356
Регистрация: 12.12.2009
Сообщений: 7,983
Записей в блоге: 2
11.02.2019, 16:13 8
Цитата Сообщение от SomniPhobia Посмотреть сообщение
Kastaneda, у меня красиво выводит.
Не может быть, покажи c Str1 как у меня.
1
567 / 406 / 132
Регистрация: 22.11.2017
Сообщений: 1,054
11.02.2019, 16:19 9
Лучший ответ Сообщение было отмечено Encrypted1010 как решение

Решение

Kastaneda, вот. Всё норм выводится.
Подловил меня? Красава.
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
27
28
29
30
31
32
33
34
35
36
37
#include <iostream>
#include <string>
#include <vector>
#include <map>
 
using namespace std;
 
template<class T, class E>
ostream& operator << (ostream& os, const map <T, vector<E>> &mp)
{
    for (const auto &pr : mp)
    {
        os << pr.first << " -> [ ";
        size_t ind = 0u;
        size_t size = pr.second.size();
        for (const auto &value : pr.second)
        {
            os << value << (ind++ != size - 1 ? ", " : "");
        }
        os << "]" << endl;
    }
    return os;
}
 
int main()
{
    system("color 0A");
 
    map <string, vector<string>> mp;
    mp.insert({ "Str1", { "Uder1.1", "Uder1.1", "Uder1.1", "Under1.2", "Uder1.1" } });
    mp.insert({ "Str2", { "Uder2.1", "Under2.2", "Uder2.3", "Under2.4" } });
    mp.insert({ "Str3", { "s1", "s2", "s3", "s4" } });
    cout << mp;
 
    system("pause");
    return 0;
}
1
Миниатюры
Вывод элементов map <string,vector<string>>  
9 / 9 / 0
Регистрация: 22.12.2017
Сообщений: 283
11.02.2019, 16:58  [ТС] 10
SomniPhobia, Kastaneda, прошу прощения, ошибка действительно была в моем коде, поэтому не работало как нужно) Спасибо за помощь!
1
Kastaneda
11.02.2019, 17:12
  #11

Не по теме:

Цитата Сообщение от SomniPhobia Посмотреть сообщение
size_t ind = 0u;
* * * * size_t size = pr.second.size();
* * * * for (const auto &value : pr.second)
* * * * {
* * * * * * os << value << (ind++ != size - 1 ? ", " : "");
* * * * }
Не хочу ввязываться в дискуссию, но кажется это явный оверхед, если уж хочется индексы, то удобней заюзать классически for.

0
567 / 406 / 132
Регистрация: 22.11.2017
Сообщений: 1,054
11.02.2019, 18:17 12
Цитата Сообщение от Encrypted1010 Посмотреть сообщение
прошу прощения
За что? Ты тренируешься, учишься. Я тоже, помогая тебе, тренируюсь.
Цитата Сообщение от Encrypted1010 Посмотреть сообщение
ошибка действительно была в моем коде, поэтому не работало как нужно)
Цитата Сообщение от Encrypted1010 Посмотреть сообщение
<< el.second
el.second в твоём случае это контейнер вектор, для него не перегружен оператор <<, в этом ошибка, нет это не ошибка, потому что если перегрузить << для вектора, тогда и твой код будет работать.
Напиши так.
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
27
28
29
30
31
32
33
#include <iostream>
#include <string>
#include <vector>
#include <map>
 
using namespace std;
 
template<class T>
ostream& operator << (ostream& os, const vector<T> &v)
{
    size_t ind = 0u;
    size_t size = v.size();
    for (const auto &value : v)
    {
        os << value << (ind++ != size - 1 ? ", " : "");
    }
    return os;
}
 
int main()
{
    system("color 0A");
 
    map <string, vector<string>> mp;
    mp.insert({ "Str1", { "Uder1.1", "Uder1.1", "Uder1.1", "Under1.2", "Uder1.1" } });
    mp.insert({ "Str2", { "Uder2.1", "Under2.2", "Uder2.3", "Under2.4" } });
    mp.insert({ "Str3", { "s1", "s2", "s3", "s4" } });
    for (const auto &el : mp)
        cout << el.first << " -> " << el.second << endl;
 
    system("pause");
    return 0;
}
Обрати внимание, твой код не изменился, а программа стала работать.
Цитата Сообщение от Encrypted1010 Посмотреть сообщение
Спасибо за помощь!
Пожалуйста!
Я рад, что помог тебе!

Добавлено через 21 минуту
Encrypted1010, чуть проще.
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
27
28
29
30
#include <iostream>
#include <string>
#include <vector>
#include <map>
 
using namespace std;
 
ostream& operator << (ostream& os, const vector<string> &v)
{
    for (const auto &str : v)
    {
        os << str<< " ";
    }
    return os;
}
 
int main()
{
    system("color 0A");
 
    map <string, vector<string>> mp;
    mp.insert({ "Str1", { "Uder1.1", "Uder1.1", "Uder1.1", "Under1.2", "Uder1.1" } });
    mp.insert({ "Str2", { "Uder2.1", "Under2.2", "Uder2.3", "Under2.4" } });
    mp.insert({ "Str3", { "s1", "s2", "s3", "s4" } });
    for (const auto &el : mp)
        cout << el.first << " -> " << el.second << endl;
 
    system("pause");
    return 0;
}
Добавлено через 5 минут
Encrypted1010, по сути string - это тоже контейнер, как и vector. String хранит в себе символы, являющиеся элементами контейнера.
Вопрос конкретно к Encrypted1010: почему программисты для вывода строки на экран не пишут так?
Код 1.
C++
1
2
3
4
5
6
string str("This is string");
for (const auto &c : str)
{
    cout << c;
}
cout << endl;
А в основном пишут так?
Код 2.
C++
1
2
string str("This is string");
cout << str << endl;
Но с вектором такое не проходит без предподготовки.
C++
1
2
vector<int> str{ 1,2,3,4,5 };
cout << str << endl;
Что код 1, что код 2 знаменуют вывод строки на консоль.
0
567 / 406 / 132
Регистрация: 22.11.2017
Сообщений: 1,054
12.02.2019, 10:32 13
Encrypted1010, я подумал, может тебе больше подойдёт контейнер multimap <string, string> он по логике представляет map <string,vector<string>>, только multimap может хранить пары с повторяющимися ключами, в отличие от map. Если использовать multimap, то его заполнение таково
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
multimap <string, string> mp;
mp.insert({ "Str1", "Uder1.1" });
mp.insert({ "Str1", "Uder1.1" });
mp.insert({ "Str1", "Uder1.1" });
mp.insert({ "Str1", "Uder1.2" });
mp.insert({ "Str1", "Uder1.1" });
mp.insert({ "Str2", "Uder2.1" });
mp.insert({ "Str2", "Uder2.2" });
mp.insert({ "Str2", "Uder2.3" });
mp.insert({ "Str2", "Uder2.4" });
mp.insert({ "Str2", "Uder2.2" });
mp.insert({ "Str3", "s1" });
mp.insert({ "Str3", "s2" });
mp.insert({ "Str3", "s3" });
mp.insert({ "Str3", "s4" });
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.02.2019, 10:32

string & LPCWSTR
Я вызываю функцию ShellExecute. Один из параметров функции - параметры приложения....

Wstring to string как конвертировать
wstring to string как конвертировать Есть текст типа wstring s=&quot;fdgd123 2133&quot; как его переделать...

Записать текст с переносами в string C++
Здравствуйте! Возникла такая проблема, не могу записать текст из файла в переменную типа string....

Немного про std::string
Привет, читал про std::string на разных сайтах. 1. Там говорят, С++ 11 гарантирует, что...


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

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

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