列表中的 erase() 在 MacOS 上的 c++ 中不起作用。什么是 bash: line 1: 88225 Segmentation fault: 11?

erase() in list does not work in c++ on MacOS. What is bash: line 1: 88225 Segmentation fault: 11?

#include <iostream>
#include <list>
using namespace std;


int main () {
    list<int> mylist;
    list<int>::iterator it;

    for(int i=1;i<6;i++){
        mylist.push_back(i);
    }
    for (it=mylist.begin(); it!=mylist.end(); ++it)
    cout << ' ' << *it;
    cout<<endl;

    for(it=mylist.begin(); it!=mylist.end();it++){
        if((*it)==2){
            mylist.erase(it);
            mylist.insert(it,9);
            break;
        }
    }
    
    for (it=mylist.begin(); it!=mylist.end(); ++it)
    cout << ' ' << *it;
    cout<<endl;
    return 0;
}

似乎 mylist.erase(it) 不工作,因为当我删除它时,程序可以工作。

以上程序的输出是

1 2 3 4 5 bash: line 1: 88370 Segmentation fault: 11 "/Users/alimtleuliyev/Desktop/quiadratic" [Finished in 441ms with exit code 139]

你需要写

   if((*it)==2){
        it = mylist.erase(it);
        mylist.insert(it,9);
        break;
    }

要输出列表,最好使用基于范围的 for 循环。

另外,要在列表中查找具有给定值的元素,最好使用标准算法 std::find 而不是使用 for 循环。

这是一个演示程序。

#include <iostream>
#include <list>
#include <iterator>
#include <algorithm>

int main()
{
    std::list<int> mylist;

    for ( int i = 1; i < 6; i++ ) 
    {
        mylist.push_back( i );
    }

    for (const auto &item : mylist)
    {
        std::cout << item << ' ';
    }
    std::cout << std::endl;

    auto it = std::find( std::begin( mylist ), std::end( mylist ), 2 );

    if ( it != std::end( mylist) )
    {
        it = mylist.erase( it );
        mylist.insert( it, 9 );
    }

    for (const auto &item : mylist)
    {
        std::cout << item << ' ';
    }
    std::cout << std::endl;
        
    return 0;
}

程序输出为

1 2 3 4 5
1 9 3 4 5

注意这一点,而不是调用成员函数 eraseinsert 你可以只写

    if ( it != std::end( mylist) ) *it = 9;