Извлечение информации из unordered_map, содержащего unordered_maps - PullRequest
0 голосов
/ 23 апреля 2019

моя проблема немного сложна для объяснения.Поэтому я постараюсь сделать себя максимально понятным.Я работаю над реализацией приложения C ++, подобной Citymapper.На текущем уровне я использую два unordered_maps, один из которых вложен в другой, а в конце - вектор пар.У меня также есть два CSV-файла, один из которых - разные станции метро, ​​ключ для unorder_map и другая другая информация, а другой - соединения между разными станциями (ключ отправления, ключ прибытия, travel_time).Я указываю, что compute_travel рассчитывает на две станции в прямом соединении.Я пытаюсь вытянуть время путешествия между двумя станциями (из, в) или (_start, _end в uint64) из _start и _end.Я реализовал две функции: compute_travel и compute_and_display_travel.Первый извлекает travel_time, а второй показывает движение между станциями.

Вот это без задержки (извините, мой французский):

vector<pair<uint64_t,uint64_t> > Station_parser:: compute_travel(uint64_t _start, uint64_t _end){
    vector<pair<uint64_t, uint64_t> > vect; //RA1I ?

    int travel_time=0; //RA1I 
    for(auto& j:connections_hashmap){
        for(auto&i:(j.second)){//pour chaque noeud de l'unordered_map connections de connections_hashmap
            if ((i.first==_start)&&(i.second==_end)){ //on recherche le couple départ-destination 
                 travel_time=j.first; //on récupère le travel_time de la connection répond au critère
            }


            else
                cout<<"Erreur"<<endl;
        }
    }

    vect.push_back(make_pair(_start,travel_time));
    return vect;  
}


vector<std::pair<uint64_t,uint64_t> > Station_parser::compute_and_display_travel(uint64_t _start, uint64_t _end){
    vector<pair<uint64_t, uint64_t> > vect=compute_travel(_start,_end);
    for(auto &i:vect){

         cout << i.first << "," << i.second << endl;
    }
    return vect;
}

Мой код компилируется, но мое travel_time установленодо 0, как если бы программа не входила в последний цикл (что не нормально).Я должен получить travel_time, который есть в моем файле .csv.Спасибо за вашу помощь.

Ответы [ 2 ]

0 голосов
/ 25 апреля 2019

спасибо, я на самом деле не понимаю, что происходит сейчас.Я использую две функции: чтение станций и чтение соединений.Чтение станций работает нормально (перегружен оператор << для проверки), но похоже, что read_connections "даже не работает".Я вставил печать в первую строку функции, но она не печатается.Вот код: </p>

        void Station_parser::read_connections(const std::string& _filename){
    cout<<"hi"<<endl; //?????????
    ifstream entree(_filename.c_str()); 
    if (entree.fail()){
        cerr<<"Error"<<endl;
    }              
    string from=" ";
    string to=" ";
    string tfr=" ";//travel_time
    while(entree.good()){
        getline(entree,from,',');
        getline(entree,to,',');
        getline(entree,tfr,'\n'); //go to next line
        uint64_t fr=strtoul(from.c_str(),NULL,10);//base 10
        uint64_t t=strtoul(to.c_str(),NULL,10);
        uint64_t tf_time=strtoul(tfr.c_str(),NULL,10);
        connections.insert({fr,t});
        connections_hashmap.insert({tf_time,connections});
    }
    entree.close();
}

К сожалению, я не могу использовать отладчик, так как я работаю над notepad ++ и компилирую Linux-bash.Я пытался использовать code :: blocks, но он не собирался, и это печально.

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

Мне кажется, я понял, что вы пытаетесь сделать.Я не понимаю, что вы подразумеваете под "не пройдя последний цикл".Код, как есть, выглядит хорошо.Однако карты не должны использоваться в этом примере по моему мнению.Кроме того, кажется, что есть ненужные копии, распределение векторов, ... Но давайте рассмотрим все это вне области видимости.

Скорее всего, ваши данные неправильно загружены в ваши карты (вы не показываете, как вызагрузить данные из входных файлов).Это также может объяснить, почему ваше время в пути установлено на 0: вы инициализируете int travel_time=0;, и если элементы не найдены в connections_hashmap, или в j.second, или если ((i.first==_start)&&(i.second==_end)) возвращает false, то travel_time останется равным 0 и будет вставлено в vector, которое вы возвращаете.

Я попробовал этот небольшой пример, чтобы показать, что ваш код должен работать при условии, что ваши данные загружены правильно, и вы вызываете свои функции с правильнымаргументы start и end (вы должны добавить некоторые исключения или поведение по умолчанию - поведение по умолчанию в текущем коде устанавливает ваше время на 0).

// time, start, end
std::unordered_map<int,std::unordered_map<int,int>> connections;

std::vector<std::pair<int,int>> compute_travel(int start, int end)
{
    std::vector<std::pair<int,int>> vect;

    int travel_time=0;

    // what if connections is empty?
    for(const auto& [time,connectedStations] : connections)
    {
        // what if connectedStations is empty?
        for(const auto& [s,e] : connectedStations)
        {
            if ( s == start && e == end)
                 travel_time = time;
            else // and what happens here?
                std::cout<< "Erreur" << std::endl;
        }
    }

    vect.push_back(std::make_pair(start,travel_time));
    return vect;  
}


std::vector<std::pair<int,int> > compute_and_display_travel(int start, int end)
{
    std::vector<std::pair<int,int> > vect = compute_travel(start,end);
    for(const auto& i : vect)
        std::cout << "depart station: " << i.first << ", time: " << i.second << std::endl;
    return vect;
}

int main()
{
    // 4 mins from station 1 to station 2
    connections[4][1] = 2;
    compute_and_display_travel(1,2);

    return 0;
}

// output: depart station: 1, time: 4
...