高人救我!!!C++数据结构vect和iterator问题

来源:百度知道 编辑:UC知道 时间:2024/07/04 02:00:01
#include<iostream>
#include<vector>
using namespace std;
template <typename T>
void josephu(int s,int m,vector<T>&v1,vector<T>&v2)
{
vector<T>::iterator str1=v1.begin(),str2=v2.begin();
for(int i=1;i<s;++i,++str1)
{
if(str1==v1.end())str1=v1.begin();
}
while(!v1.empty())
{
for(int i=1;i<m;++i,++str1)
{
if(str1==v1.end())str1=v1.begin();
}

v2.insert(str2++,*str1);
v1.erase(str1);

}
}
int main()
{
int s,m,n;
cout<<"请输入人数:"<<endl;
cin>>n;
vector<int> va(n),vb(n);
for(int i=0;i<n;i++)
{
va[i]=i+1;
cout<<va[i]<<" ";
}
cout<<endl;
cout<<"请输入报数起始位置和报数值:"<<endl;
cin>>s>>m;
josephu(s,m,va,vb );
cout<<"出列序列

你的错误在于v1.erase(str1);因为str1有可能为V1.END()
另外你需要的是顺序输出把,insert是在迭代器的前面添加,且返回添加元素的迭代器,容器添加数据会使你的str2失效,所有后面无法继续插入
由于不想太多改动
所以最后将代码
v2.insert(str2++,*str1);
v1.erase(str1);
改为
if(str1!=v1.end()) {v2.push_back(*str1);str1=v1.erase(str1);}
else {str1=v1.begin();v2.push_back(*str1);str1=v1.erase(str1);}
就OK了 调试过 成功通过

说了半天也没说出什么错误。。。

应该是josephu函数里对vector进行操作时,出现错误,导致数据结构被破坏.我觉得可能是erase的用法有问题

很明显 erase会使迭代器失效 在循环中多次使用 运行出错

这个,鉴于阅读你的代码后,发现STL刚刚起步,有些基本的判断没有加上而已,给你改一下,并不难:

#include<iostream>
#include<vector>
using namespace std;
template <typename T>
void josephu(int s,int m,vector<T>&v1,vector<T>&v2)
{
vector<T>::iterator str1=v1.begin(),str2=v2.begin();
for(int i=1;i<s;++i,++str1)
{
if(str1==v1.end())
str1=v1.begin();
}

while( v1.size() > 1 )
{