[英]Seg fault with iterators in a recursive function
我正在嘗試使用遞歸函數對向量中的整數進行排序。 我的程序運行,編譯和排序數據,但事實證明這給我帶來了段錯誤。 我認為這是因為使用了向量中已更改地址的for循環導致了它永遠不會離開循環。
void Plays::SortRelevance(vector<Plays> list){
cout << "in the loop" << endl;
for(vector<Plays>::iterator i=list.begin(); i != list.end(); ++i){
cout << i->relevance << endl;
}
for(vector<Plays>::iterator i=list.begin(); i != list.end(); ++i){
if(i->relevance < (i+1)->relevance){
cout << "IN THE THINGY WAT" << endl;
Plays temp(*i);
list.erase (i);
list.push_back (temp);
SortRelevance(list);
cout << "left recursive" << endl;
}
cout << "stuck?" << endl;
}
cout << "left the loop" << endl;
for(vector<Plays>::iterator i=list.begin(); i != list.end(); ++i){
cout << i->relevance << endl;
}
}
輸出的末尾如下所示,進行排序,但最后給出段錯誤:
IN THE THINGY WAT
in the loop
-62
-62
-62
-69
-71
-72
-80
-81
-87
-89
-94
-100
-104
-107
-107
-112
-137
-142
-145
-150
-151
stuck?
stuck?
stuck?
stuck?
stuck?
stuck?
stuck?
stuck?
stuck?
stuck?
stuck?
stuck?
stuck?
stuck?
stuck?
stuck?
stuck?
stuck?
stuck?
stuck?
Segmentation fault
在此先感謝可以為我闡明這一點的任何人。
編輯:我還沒有解決問題,而是找到了更好,更優雅的方法來解決這個問題。 我創建了一個類,重載了運算符,然后使用sort()函數對需要執行的操作進行排序。
您不得在無效的迭代器上進行操作,並且erase(it)
會使it
無效。 典型的擦除循環如下所示:
for (auto it = v.cbegin(); it != v.cend() /* not hoisted */; /* no increment */)
{
if (delete_condition)
{
it = v.erase(it); // or "v.erase(it++);"
}
else
{
++it;
}
}
(C ++ 11中的標准庫中已進行了一些清理,以使所有容器擦除功能返回下一個迭代器,但情況並非如此,帶有it++
的版本可能在更多版本上可用平台。)
void Plays::SortRelevance(vector<Plays> list){
該簽名每次都會獲取列表的副本。 您可能希望將其作為參考。
if(i->relevance < (i+1)->relevance){
當i
是最后一個元素時(即i+1==list.end()
),這超出了范圍。
list.erase (i);
此行使list的所有迭代器無效(這是一個糟糕的名稱,它是向量,而不是列表)。 現在這意味着i
無效,因此循環的下一個++i
也無效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.