从包含unordered_maps的unordered_map中提取信息

时间:2019-04-23 18:16:11

标签: c++ vector unordered-map

我的问题很难解释。因此,我将尝试使自己尽可能清晰。我正在研究像Citymapper这样的C ++应用程序。在当前级别,我使用两个unordered_maps,其中一个嵌套在另一个中,最后是成对的向量。我也有两个.csv文件,其中一个是不同的地铁站,一个是unorder_map和其他信息的键,另一个是包含不同站之间的连接(出发键,到达键,travel_time)。我指定直接连接的两个工作站的compute_travel计数。我正在尝试从_start和_end拉两个站点(从,到)或(uint64中的_start,_end)之间的travel_time。我实现了两个函数:compute_travel和compute_and_display_travel。第一个提取出行时间,第二个显示出站点之间的运动。

这是刻不容缓的(对不起,我的法语):

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,就好像程序没有进入最后一个循环(这是不正常的)一样。我应该得到我的.csv文件中的travel_time。感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

我想我已经了解您要做什么。我不明白您的意思是“不经过最后一个循环”。这样的代码看起来还不错。但是,我认为在此示例中不应使用地图。另外,似乎有不需要的副本,向量分配等。但是让我们考虑所有这些超出范围。

很可能您的数据被错误地加载到地图中(您没有显示如何从输入文件中加载数据)。这也可以解释为什么将旅行时间设置为0:初始化int travel_time=0;,并且在connections_hashmapj.second中找不到元素,或者((i.first==_start)&&(i.second==_end))返回false,那么travel_time将保持等于0,并被推送到您返回的vector中。

我尝试了一个小示例,以证明您的代码可以正常工作,前提是您的数据已正确加载,并且您使用正确的参数startend调用函数(应添加一些异常或默认行为) -当前代码的默认行为是将您的时间设置为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

答案 1 :(得分:-1)

谢谢,我实际上不知道现在发生了什么。我使用两个功能:读取站和读取连接。阅读站工作正常(重载<<操作符进行验证),但就像read_connections“甚至无法工作”。我在函数的第一行插入了打印件,但没有打印。这是代码:

        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,但它没有构建,这很可悲。