Чтение из файла в карту с ключом в виде целых чисел и соответствующими значениями в виде набора - PullRequest
0 голосов
/ 06 июня 2018

У меня есть записи в текстовом файле в виде:

329881 100000005 100000125 100000145 
390876 100000667 100000745 100000288 100000395 100000392
289456 100034560 100000145 100000286 100000245

... ...

Я хочу прочитать этот текстовый файл, структура за структурой в картукоторый имеет 2 поля:

struct keyvaluestruct
{
    uint64_t _key;
    unordered_set<uint64_t> _set;
};

, где ключ для 1-й структуры должен быть 329881, а набор должен быть 100000005 100000125 100000145.Аналогично, для 2-й структуры ключ должен быть 390876, а значения в наборе должны быть 100000667 100000745 100000288 100000395 100000392.Эти структуры затем вставляются в карту

map < uint64_t,unordered_set< uint64_t>> _mapstructs;

Я придерживаюсь подхода:

keyvaluestruct s1;

ifstream ifile('file.txt')

while(!ifile.eof())
{
    ifile>>key>>vset;

    s1._key = key;

    s1._set = vset;

    _mapstructs.insert(s1._key,s1._set);
}

Может ли кто-нибудь помочь мне исправить этот подход или предложить альтернативный подход?

1 Ответ

0 голосов
/ 06 июня 2018

Примерно так:

#include <unordered_set>
#include <iostream>
#include <sstream>
#include <cstdint>

struct Data
{
    uint64_t key;
    std::unordered_set<uint64_t> set;

    friend std::istream& operator>>(std::istream& s, Data& data) {
        std::string line;
        getline(s, line);
        std::istringstream s2(line);
        s2 >> data.key;
        data.set.clear();
        for(uint64_t element; s2 >> element;)
            data.set.insert(element);
        return s;
    }

    friend std::ostream& operator<<(std::ostream& s, Data const& data) {
        s << data.key;
        for(auto const& element : data.set)
            s << ' ' << element;
        return s;
    }
};

int main() {

    std::istringstream input("329881 100000005 100000125 100000145\n"
                             "390876 100000667 100000745 100000288 100000395 100000392\n"
                             "289456 100034560 100000145 100000286 100000245\n");
    Data data[3];
    for(auto& d : data)
        input >> d;

    for(auto& d : data)
        std::cout << d << '\n';
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...