C++容器问题。老是出现段错误。

#include
using namespace std;
#include
int main(void)
{
list Boy;
for(int i = 1; i <= 100; ++i)
{
Boy.push_back(i);
}
list::iterator it = Boy.begin();
int num = 1;
while(Boy.size() > 1)
{
if(num%3 == 0)
{
Boy.remove(*it);
}
else
{
++it;
}
if(it == Boy.end())
{
it = Boy.begin();
}
++num;
}
cout << *it << endl;
return 0;
}

你应该yerase删除,同时删除后要调整迭代器,不然会失效。

removeeraseinsertpush_backpop_back等一系列会修改容器中元素个数的操作都会造成迭代器(iterator)失效,建议你换一种方法,常用的办法是把对象拷贝一份,像下面这种:

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

int main(void)
{
    list<int> Boy;

    for(int i = 1; i <= 100; ++i)
    {
        Boy.push_back(i);
    }

    int num = 1;

    while(Boy.size() > 1)
    {
        list<int> tmpBoy;

        list<int>::iterator it = Boy.begin();
        for (; it != Boy.end(); it++)
        {
            if(num++ % 3 == 0)
            {
                continue;
            }

            tmpBoy.push_back(*it);
        }

        Boy = tmpBoy;
    }

    cout << *Boy.begin() << endl;
    return 0;
}

按照你的代码逻辑改的,应该输出的是你想要的结果。

P.S.:好像是N年前在oj上刷过的水题。