1

我正在尝试使用递归函数对向量中的整数进行排序。我的程序运行、编译和排序数据,但事后它给了我一个段错误。我认为这是因为 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() 函数对我需要做的事情进行排序。

4

2 回答 2

4

您不能对无效的迭代器进行操作,并且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++可能适用于更多平台.)

于 2013-09-16T22:14:53.860 回答
1
void Plays::SortRelevance(vector<Plays> list){

此签名每次都会获取列表的副本。您可能希望将其作为参考。

if(i->relevance < (i+1)->relevance){

什么时候i是最后一个元素(即i+1==list.end()),这超出了界限。

list.erase (i);

此行使 list 的所有迭代器无效(这是一个糟糕的名字——它是一个向量,而不是一个列表)。现在这意味着i无效,因此++i循环的下一个同样无效。

于 2013-09-16T22:13:23.620 回答