#include <iostream>
#include <vector>
#include <map>
#include <algorithm>
#include <string>
using namespace std;
int n = 17;
vector < string > ports (n, "");
vector < string > checked (ports);
multimap < string, string > routes;
void check_routes (string x)
{
// checked.erase (std::remove (checked.begin (), checked.end (), x));
for (vector < string >::iterator it1 = checked.begin ();it1 != checked.end (); it1++)
{
if (*it1 == x)
{
checked.erase (it1);
}
}
for (multimap < string, string >::iterator it = routes.begin ();
it != routes.end (); it++)
{
if (it->first == x)
{
check_routes (it->second);
}
}
}
int main ()
{
int ans = 0;
ports.push_back ("BUD");
ports.push_back ("BGI");
ports.push_back ("DEL");
ports.push_back ("DOH");
ports.push_back ("DSM");
ports.push_back ("EWR");
ports.push_back ("EYW");
ports.push_back ("HND");
ports.push_back ("ICN");
ports.push_back ("JFK");
ports.push_back ("LGA");
ports.push_back ("LHR");
ports.push_back ("ORD");
ports.push_back ("BSAN");
ports.push_back ("SFO");
ports.push_back ("SIN");
ports.push_back ("TLV");
routes.insert (make_pair ("DMS", "ORD"));
routes.insert (make_pair ("ORD", "BGI"));
routes.insert (make_pair ("BGI", "LGA"));
routes.insert (make_pair ("SIN", "CDG"));
routes.insert (make_pair ("CDG", "SIN"));
routes.insert (make_pair ("CDG", "BUD"));
routes.insert (make_pair ("DEL", "DOH"));
routes.insert (make_pair ("DEL", "CDG"));
routes.insert (make_pair ("TLV", "DEL"));
routes.insert (make_pair ("EWR", "HND"));
routes.insert (make_pair ("HND", "ICN"));
routes.insert (make_pair ("HND", "JFK"));
routes.insert (make_pair ("ICN", "JFK"));
routes.insert (make_pair ("JFK", "LGA"));
routes.insert (make_pair ("EYW", "LHR"));
routes.insert (make_pair ("LHR", "SFO"));
routes.insert (make_pair ("SFO", "SAN"));
routes.insert (make_pair ("SFO", "DSM"));
routes.insert (make_pair ("SAN", "EYW"));
for (int i = 0; !(checked.empty ()); i++)
{
check_routes (checked[i]);
ans++;
}
cout << ans;
return 0;
}
因此,我试图解决在网上发现的机场接驳问题,这就是我的看法。但是我无法弄清楚代码中的错误所在。如果有人可以帮助我,我将不胜感激。 (PS问题是这样的-我有机场(矢量端口)列表,以及这些端口(多地图路线)之间的一种单向连接,我需要找出我需要进行的最少连接数量所有端口(连接的长度无关紧要).............该代码应该做的是找到单个端口/网络的数量。互连端口,我相信这会给我所需的答案,因为我要做的就是从每个链中连接一个节点)
答案 0 :(得分:2)
正如Evg所说,问题出在这里:
for (vector < string >::iterator it1 = checked.begin ();it1 != checked.end (); it1++)
{
if (*it1 == x)
{
checked.erase (it1);
}
}
erase
使vector
中所有从迭代开始的元素中的迭代器失效,因此,下次循环时,该程序的操作是未定义的(在您的情况下,它会发生段错误,可能是因为它运行了数组的结尾)。
通常的解决方案是在algorithm
库的帮助下使用erase remove idiom,如下所示:
checked.erase (std::remove (checked.begin (), checked.end (), x));
然后,它起作用了。
答案 1 :(得分:0)
这是遍历列表时修改列表的常见问题。您从列表中删除或移动元素,这意味着该列表成为另一个列表,需要您进行其他操作。最后,您会发现您访问的元素或位置超出范围。我认为,您需要改变对这个问题的看法。