问题描述
- 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删除,同时删除后要调整迭代器,不然会失效。
解决方案二:
remove
,erase
,insert
,push_back
,pop_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上刷过的水题。
时间: 2024-12-30 22:26:47