簡體   English   中英

遞歸函數中迭代器的段錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM