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
这是在遍历列表时修改列表的常见问题。您从列表中删除或移动元素,这意味着该列表将成为另一个列表,需要您执行另一种行为。最后,您会发现您访问了超出范围的元素或位置。在我看来,您需要改变对这个问题的想法lem.正如Evg所说,问题在于: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
#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);
invalidatesit1
@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));