vector iterator not dereferencable
#include"stdafx.h"#include<iostream>#include<vector>#include<cassert>#include<ctime>u...
#include "stdafx.h"
#include <iostream>
#include <vector>
#include <cassert>
#include <ctime>
using namespace std;
#line 1
template<class T>
typename vector<T>::iterator YSF(vector<T>& myvector,int n,int m)
{
typename vector<T>::iterator iter;
for(iter=myvector.begin();iter!=myvector.end();iter++)
if(*iter==1)
break;
assert(iter<myvector.end()); //断言,若无编号为1的元素,终止程序
vector<T>::iterator it=iter; //it保存下一个开始报数元素的迭代器
while(myvector.size()>1)
{
int ii=(it-myvector.begin()+m)%n; //ii为下一个开始报数元素的下标
//得到下一个开始报数元素的迭代器
if(ii==myvector.size())
{
myvector.erase(--it);
it=myvector.begin();
}
else
{
advance(it,ii-(it-myvector.begin()) );
it=myvector.erase(--it); //擦除报到m的元素
}
}
return it;
}
void main()
{
vector<int> myvector;
int n,m; //n为元素个数
cout << "input the num of array:";
cin >> n;
for(int i=0;i<n;i++)
myvector.push_back(i+1);
cout << "input m for limits:";
cin >> m;
time_t start,end; //统计时间
start=time(NULL);
vector<int>::iterator iter=YSF(myvector,n,m);
end=time(NULL);
cout << "the last element is:" << *iter << " and take times:" << difftime(end,start) << endl;
}
//还有如果有知道引发这类型运行错误的也可以告诉我,谢谢 展开
#include <iostream>
#include <vector>
#include <cassert>
#include <ctime>
using namespace std;
#line 1
template<class T>
typename vector<T>::iterator YSF(vector<T>& myvector,int n,int m)
{
typename vector<T>::iterator iter;
for(iter=myvector.begin();iter!=myvector.end();iter++)
if(*iter==1)
break;
assert(iter<myvector.end()); //断言,若无编号为1的元素,终止程序
vector<T>::iterator it=iter; //it保存下一个开始报数元素的迭代器
while(myvector.size()>1)
{
int ii=(it-myvector.begin()+m)%n; //ii为下一个开始报数元素的下标
//得到下一个开始报数元素的迭代器
if(ii==myvector.size())
{
myvector.erase(--it);
it=myvector.begin();
}
else
{
advance(it,ii-(it-myvector.begin()) );
it=myvector.erase(--it); //擦除报到m的元素
}
}
return it;
}
void main()
{
vector<int> myvector;
int n,m; //n为元素个数
cout << "input the num of array:";
cin >> n;
for(int i=0;i<n;i++)
myvector.push_back(i+1);
cout << "input m for limits:";
cin >> m;
time_t start,end; //统计时间
start=time(NULL);
vector<int>::iterator iter=YSF(myvector,n,m);
end=time(NULL);
cout << "the last element is:" << *iter << " and take times:" << difftime(end,start) << endl;
}
//还有如果有知道引发这类型运行错误的也可以告诉我,谢谢 展开
2个回答
展开全部
你擦除报到m的元素时有个逻辑错误,当报道的m元素为第一个元素时,你使用:
it=myvector.erase(--it);
因为it本来就指向第一个元素,你执行--it时,it指向了vector以外的一个未知位置(即,超出了数据边界限),所以会报错.
做如下修改:
...
if ( it == myvector.begin() )
{
myvector.erase(it);
it = myvector.begin();
}
else
{
it=myvector.erase(it); //擦除报到m的元素
it--;
}
...
===================
另外,要避免这类型的运行错误有两个办法:
(1)使用数组或者向量等数据类型时,要保证数据的访问不要超出数据的边界(即不要越界访问数据;
(2)尽量避免在访问数据的语句中使用自增和自减预算符;
it=myvector.erase(--it);
因为it本来就指向第一个元素,你执行--it时,it指向了vector以外的一个未知位置(即,超出了数据边界限),所以会报错.
做如下修改:
...
if ( it == myvector.begin() )
{
myvector.erase(it);
it = myvector.begin();
}
else
{
it=myvector.erase(it); //擦除报到m的元素
it--;
}
...
===================
另外,要避免这类型的运行错误有两个办法:
(1)使用数组或者向量等数据类型时,要保证数据的访问不要超出数据的边界(即不要越界访问数据;
(2)尽量避免在访问数据的语句中使用自增和自减预算符;
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
error:vector iterator not dereferencable
两个程序运行一下就知道,之前的vector还没有被初始化,此时使用begin()迭代器肯定是吹出问题的。
这种问题1:越界,[begin,end),左闭合区间 2:未初始化,调用无意义 3:list等迭代器也可能会出现这种问题,一样处理。
原文来自:网页链接
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询