简而言之,当尝试遍历地图时,是否可以在不是* .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/

10-16 19:13