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;
}
//还有如果有知道引发这类型运行错误的也可以告诉我,谢谢
展开
 我来答
moxsone
推荐于2018-02-01 · TA获得超过3332个赞
知道大有可为答主
回答量:2796
采纳率:50%
帮助的人:1495万
展开全部
你擦除报到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)尽量避免在访问数据的语句中使用自增和自减预算符;
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
事务所每蚁复
2018-01-31
知道答主
回答量:2
采纳率:0%
帮助的人:1761
展开全部

error:vector iterator not dereferencable

两个程序运行一下就知道,之前的vector还没有被初始化,此时使用begin()迭代器肯定是吹出问题的。
这种问题1:越界,[begin,end),左闭合区间   2:未初始化,调用无意义  3:list等迭代器也可能会出现这种问题,一样处理。

原文来自:网页链接

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式