我的问题很难解释。因此,我将尝试使自己尽可能清晰。我正在研究像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。感谢您的帮助。
答案 0 :(得分:0)
我想我已经了解您要做什么。我不明白您的意思是“不经过最后一个循环”。这样的代码看起来还不错。但是,我认为在此示例中不应使用地图。另外,似乎有不需要的副本,向量分配等。但是让我们考虑所有这些超出范围。
很可能您的数据被错误地加载到地图中(您没有显示如何从输入文件中加载数据)。这也可以解释为什么将旅行时间设置为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
答案 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,但它没有构建,这很可悲。