C++ 为什么该代码会导致分段错误? #包括 #包括 #包括 #包括 #包括 使用名称空间std; int n=17; 向量端口(n,“”); 向量已检查(端口); 多重地图路线; 无效检查路径(字符串x) { //checked.erase(std::remove(checked.begin(),checked.end(),x)); 对于(vector::迭代器it1=checked.begin();it1!=checked.end();it1++) { 如果(*it1==x) { 选中。擦除(it1); } } for(multimap::iterator it=routes.begin(); it!=routes.end();it++) { 如果(it->first==x) { 检查路径(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(配对(“DMS”、“ORD”); routes.insert(成对(“ORD”、“BGI”); routes.insert(配对(“BGI”、“LGA”); routes.insert(配对(“SIN”、“CDG”); routes.insert(配对(“CDG”、“SIN”); routes.insert(成对(“CDG”、“BUD”); routes.insert(成对(“DEL”、“DOH”); routes.insert(成对(“DEL”、“CDG”); routes.insert(成对(“TLV”、“DEL”); 插入(成对(“EWR”、“HND”); routes.insert(配对(“HND”、“ICN”); routes.insert(配对(“HND”、“JFK”); routes.insert(配对(“ICN”、“JFK”); routes.insert(配对(“JFK”、“LGA”); routes.insert(成对(“EYW”、“LHR”); routes.insert(成对(“LHR”、“SFO”); routes.insert(配对(“SFO”、“SAN”); routes.insert(配对(“SFO”、“DSM”); routes.insert(成对(“SAN”、“EYW”); 对于(int i=0;!(checked.empty());i++) { 检查路线(检查[i]); ans++; } cout

C++ 为什么该代码会导致分段错误? #包括 #包括 #包括 #包括 #包括 使用名称空间std; int n=17; 向量端口(n,“”); 向量已检查(端口); 多重地图路线; 无效检查路径(字符串x) { //checked.erase(std::remove(checked.begin(),checked.end(),x)); 对于(vector::迭代器it1=checked.begin();it1!=checked.end();it1++) { 如果(*it1==x) { 选中。擦除(it1); } } for(multimap::iterator it=routes.begin(); it!=routes.end();it++) { 如果(it->first==x) { 检查路径(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(配对(“DMS”、“ORD”); routes.insert(成对(“ORD”、“BGI”); routes.insert(配对(“BGI”、“LGA”); routes.insert(配对(“SIN”、“CDG”); routes.insert(配对(“CDG”、“SIN”); routes.insert(成对(“CDG”、“BUD”); routes.insert(成对(“DEL”、“DOH”); routes.insert(成对(“DEL”、“CDG”); routes.insert(成对(“TLV”、“DEL”); 插入(成对(“EWR”、“HND”); routes.insert(配对(“HND”、“ICN”); routes.insert(配对(“HND”、“JFK”); routes.insert(配对(“ICN”、“JFK”); routes.insert(配对(“JFK”、“LGA”); routes.insert(成对(“EYW”、“LHR”); routes.insert(成对(“LHR”、“SFO”); routes.insert(配对(“SFO”、“SAN”); routes.insert(配对(“SFO”、“DSM”); routes.insert(成对(“SAN”、“EYW”); 对于(int i=0;!(checked.empty());i++) { 检查路线(检查[i]); ans++; } cout,c++,C++,这是在遍历列表时修改列表的常见问题。您从列表中删除或移动元素,这意味着该列表将成为另一个列表,需要您执行另一种行为。最后,您会发现您访问了超出范围的元素或位置。在我看来,您需要改变对这个问题的想法lem.正如Evg所说,问题在于: #include <iostream> #include <vector> #include <map> #include <algorithm> #include <string> using names

这是在遍历列表时修改列表的常见问题。您从列表中删除或移动元素,这意味着该列表将成为另一个列表,需要您执行另一种行为。最后,您会发现您访问了超出范围的元素或位置。在我看来,您需要改变对这个问题的想法lem.

正如Evg所说,问题在于:

#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;
}
然后,它起作用了


为什么不使用调试器并使用断点跟踪分段错误的准确行?投入精力。segfault在哪里?for循环使用i,但它的条件是checked不为空,因此您可以轻松离开向量的末尾。
checked.erase(it1);
invalidates
it1
@AbhishekGupta,没关系。我们都在这里学习。很好的解决方案,我现在知道我错在哪里了……你的意思是,在我的解决方案中,it1只是左摆右摆,对吗?差不多,是的,看:是的,我可能不得不这么做……尽管你认为解决方案的整个逻辑都错了吗?还是仅仅是im实施?这是一个实施问题。请注意,如果我的答案听起来不错,请投票表决。
for (vector < string >::iterator it1 = checked.begin ();it1 != checked.end (); it1++)
{
    if (*it1 == x)
    {
        checked.erase (it1);
    }
}
checked.erase (std::remove (checked.begin (), checked.end (), x));