Вставить / прочитать набор в карту - PullRequest
0 голосов
/ 23 января 2019

Я хочу «управлять» рейсами, используя map<string, set<string>>. Клавиши string представляют номер рейса, а значения set<string> представляют имена людей, зарегистрированных на рейсе. В моем случае я читаю данные из простого текстового файла, такого как:

123 jhonny
132 harry
123 bill
145 herry
132 jarry

чтобы найти людей в одном рейсе.

Я знаю, что основной способ вставить в карту это

map<string, string> m;
m["hi"] = test;

и использование итератора для чтения контейнера.

Но как мне вставить и прочитать композицию набора в карту?

Я пытался использовать двойной итератор или использовать while и итератор для получения данных из файла:

string pers, volo;
while (wf >> volo >> pers) {
    m[volo] = pers;
}

но выдает ошибку.

Я новичок в STL, и я прочитал некоторые файлы, руководства и другие, чтобы изучить наборы и карты, но я не нашел ничего о композиции контейнеров (такой как описанный мной). Как я могу это сделать? Возможно, с двойным итератором на карте и на множестве?

Спасибо.

1 Ответ

0 голосов
/ 23 января 2019

Просто относитесь к своему m[volo] как к любому обычному набору.Ваш set будет создан по умолчанию, как только вы получите доступ к его значению, используя std::map::operator[].Это позволяет вам напрямую использовать любую из функций-членов set.Чтобы добавить значение в набор, используйте std::set::insert.

Вот как может выглядеть ваш код при использовании стандартного ввода / вывода:

string a, b;
while (cin >> a >> b) {
    m[a].insert(b);
    cout << m[a].size() << endl;
}

Если вы хотите вывести свой набор, удобный способ сделать это - определить перегрузку operator<<.Далее шаблон определяет любой набор.

template<typename T>
std::ostream& operator<<(std::ostream& os, const std::set<T>& s)
{
    for (auto& el : s)
        os << el << ' ';
    return os;
}

Это позволяет без ошибок выполнять следующие действия.

for (auto it = m.begin(); it != m.end(); ++it)
{
    cout << it->first;   // a string
    cout << ' ';
    cout << it->second;   // a set
    cout << endl;
}
...