从包含 unordered_maps 的 unordered_map 中提取信息

Posted

技术标签:

【中文标题】从包含 unordered_maps 的 unordered_map 中提取信息【英文标题】:Extract information from an unordered_map containing of unordered_maps 【发布时间】:2019-04-23 18:16:10 【问题描述】:

我的问题解释起来有点复杂。所以我会尽量让自己清楚。我正在研究像 Citymapper 这样的 C++ 应用程序实现。在当前级别,我使用了两个 unordered_map,其中一个嵌套在另一个中,最后是一个对向量。我还有两个 .csv 文件,其中一个是不同的地铁站,一个用于 unorder_map 和其他不同信息的键,另一个包含不同车站之间的连接(出发键、到达键、travel_time)。我指定 compute_travel 计入直接连接的两个站点。我试图从 _start 和 _end 中提取两个站点(从,到)或(_start,uint64 中的_end)之间的 travel_time。我实现了两个函数: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,就好像程序没有进入最后一个循环一样(这是不正常的)。我应该得到我的 .csv 文件中的 travel_time。感谢您的帮助。

【问题讨论】:

请在此处发布minimal reproducible example 以重现您的问题。 ...如果cmets携带有价值的信息,请翻译。如果没有,请删除它们。 【参考方案1】:

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

很可能,您的数据未正确加载到地图中(您没有显示如何从输入文件加载数据)。这也可以解释为什么您的旅行时间设置为 0:您初始化 int travel_time=0;,如果在 connections_hashmapj.second 中未找到任何元素,或者如果 ((i.first==_start)&amp;&amp;(i.second==_end)) 返回 false,则 @987654326 @ 将保持等于 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

【讨论】:

【参考方案2】:

谢谢,我真的不明白现在发生了什么。我使用两个功能:读站和读连接。读取站工作正常(重载

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

【讨论】:

你应该保留答案部分的答案。 尝试获取一个最小的例子。用这种方式帮助你是不可能的。可能,当您编写最小示例时,您就会明白错误在哪里。 我不知道如何在 cmets 部分添加代码。无论如何,您所说的最小示例是什么意思?因为,现在,我最大的问题是我的 read_connections 函数甚至无法正常工作。 您还没有共享 read_connections 函数,所以我无法对此发表评论。您应该尝试让它在 code::blocks 或任何其他 IDE 上运行并进行调试。 我确实分享了 read_connections 函数。这是我的第二个帖子。我试图让它在 cde::blocks 上工作,但我收到了一条我之前没有的错误消息:'' token 之前的异常类。我应该有这个。我现在有点迷路了

以上是关于从包含 unordered_maps 的 unordered_map 中提取信息的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ std::unordered_map 中预分配桶

从包含 unordered_maps 的 unordered_map 中提取信息

无法从分离的线程访问 C++ unordered_map 中的键值对

boost::boost::unordered_map 的序列化

为什么矢量比unordered_map快?

包含头文件unordered_map时出错