简而言之,当尝试遍历地图时,是否可以在不是* .begin()的索引/键处启动迭代器?
我有一个城市的map
类别为“ City
”。 (城市具有城市坐标,在以下代码中,calc_dist(c1,c2)将计算坐标之间的距离)。我正在尝试创建一个“ 2D地图”(即map<string, map<string, double>> dist
),该地图可以使用dist[city1][city2]
访问城市之间的距离。
为了计算距离,我基本上在城市上创建了一个嵌套的迭代器,它可以工作,但是在使用许多城市时速度很慢。由于城市之间的距离是对称的,因此我可以通过将距离存储在地图的反面来将环切成两半。
我希望做的是从第一个迭代器在当前城市启动第二个迭代器。 http://www.cplusplus.com/reference/map/map/告诉我该顺序已保留,因此我认为我应该能够这样做。
样例代码:
// Function create_distance_chart(...)
map<string, map<string, double>> create_distance_chart(map<string, City> c){
map<string, map<string, double>> dist;
for (map<string, City>::iterator it = c.begin(); it != c.end(); ++it){
for (map<string, City>::iterator it2 = c.begin(); it2 != c.end(); ++it2) { // here i can make improvements, i hope
//calculate distance
dist[c[it->first]][c[it2->first]] = calc_dist(c[it->first],c[it2->first])// store in map
dist[c[it2->first]][c[it->first]] = calc_dist(c[it->first],c[it2->first])// store in map in the other direction.
}
}
}
在行中
for (map<string, City>::iterator it2 = c.begin(); it2 != c.end(); ++it2) {
我试图将
c.begin
更改为c[it->first]
,c.at(it->first)
,仅更改为it->first
,并设置了一个虚拟变量来提取it->first
的索引。我正在考虑的唯一其他方法是为第二个迭代器执行反向迭代器,并具有终止条件,该条件可能导致第二个循环在
it2 != c.end()
之前结束(即在第一个迭代器所在的城市),但是我没有取得进展现在在该域中。提前致谢!
最佳答案
首先这句话:
c[it->first]
是一种缓慢而复杂的方式来简单地说:
it->second
而且当您在循环中使用8次时,它确实很慢也就不足为奇了。
对于您的循环,看起来您想将第二个循环更改为:
for (map<string, City>::iterator it2 = std::next(it); it2 != c.end(); ++it2)
注意:如果您不想更改地图中的值,可以使用
std::map::const_iterator
代替。注意2:我假设计算城市与城市之间的距离是没有意义的。如果您的几何不是这种情况,则在上面的代码中删除
std::next()
,然后在第二个循环初始化中将it
分配给it2
。关于c++ - 在city.begin()处启动 map 迭代器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48795916/