canopy算法 vector subscript out of range

时间:2022-03-13 16:44:18
#include<iostream>
#include<string>
#include<vector>
#include<iomanip>
#include<ctime>
#include<fstream>
#define PI 3.141592653

using namespace std; using std::vector; using std::string; using std::fstream;

//度数转化为弧度函数
double rad(double n)
{
return n * PI / 180;
}

//取a-b之间范围的随机数函数
int random(int a, int b)
{
int dis = b - a;
return rand() % dis + a;
}

//计算两个经纬度之间的距离
double distance(double longitude1, double latitude1, double longitude2, double latitude2)
{
double Lat1 = rad(latitude1);
double Lat2 = rad(latitude2);
double a = Lat1 - Lat2;
double b = rad(longitude1) - rad(longitude2);
double s = 2 * asin(sqrt(pow(sin(a / 2), 2) + cos(Lat1)*cos(Lat2)*pow(sin(b / 2), 2)));
s = s * 6378137;
return s;
}

//取模函数





int main()
{
ifstream input;

vector<vector<double>> ivec;
double N1, N2;

vector<vector<vector<double>>> END;
int cnt = 0;


input.open("C:\\Users\\Rooobins\\Desktop\\DataXXYY.txt", fstream::in);

if (!input.is_open())
{
cout << "Open file failure." << endl;
}

for (int i = 0; i != 30557; ++i)
{
vector<double> N;
input >> N1 >> N2;
N.push_back(N1);
N.push_back(N2);
ivec.push_back(N);
N.clear();
}

while (ivec.size() != 0)
{

double DIS;
size_t M = random(0, ivec.size()-1);
for (auto q = ivec.begin(); q != ivec.end(); ++q)
{
DIS = distance((*q)[0], (*q)[1], ivec[M][0], ivec[M][1]);
if (abs(DIS) <= 3000)
{
END[cnt].push_back(*q);
}
else if (abs(DIS) <= 2500)
{
q = ivec.erase(q);
}
}
++cnt;
}

cout << END.size() << endl;

system("pause");
}



一直看不出来  怎么修改  求助

7 个解决方案

#1


你若是erase了最后一个元素,那么新的q恰好等于end(),下次q++,仍然满足q!=end(),但已经超出范围。

#2


代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。

#3


引用 1 楼 srhouyu 的回复:
你若是erase了最后一个元素,那么新的q恰好等于end(),下次q++,仍然满足q!=end(),但已经超出范围。


但是这样应该怎么改呢,我改了还是不行

#4


引用 1 楼 srhouyu 的回复:
你若是erase了最后一个元素,那么新的q恰好等于end(),下次q++,仍然满足q!=end(),但已经超出范围。


但是这个应该怎么改呢,我改了还是一样报错

#5


引用 4 楼 jiuzhibuguniao 的回复:
Quote: 引用 1 楼 srhouyu 的回复:

你若是erase了最后一个元素,那么新的q恰好等于end(),下次q++,仍然满足q!=end(),但已经超出范围。


但是这个应该怎么改呢,我改了还是一样报错


我搞不清楚你的思路,所以说的不一定正确,但是你应该把程序写得思路更清晰一些。
最外层的while循环的判断条件为什么是ivec.size() != 0。你内层的for假若能将ivec清空,那么外层while只能执行一遍。
你的for循环应该弃用迭代器并改成while,用类似于ivec.size() != 0的判断方法
你的END是三维数组,而最外层的数组从来没有添加过元素,为何会直接取END[cnt]

#6


引用 5 楼 srhouyu 的回复:
Quote: 引用 4 楼 jiuzhibuguniao 的回复:

Quote: 引用 1 楼 srhouyu 的回复:

你若是erase了最后一个元素,那么新的q恰好等于end(),下次q++,仍然满足q!=end(),但已经超出范围。


但是这个应该怎么改呢,我改了还是一样报错


我搞不清楚你的思路,所以说的不一定正确,但是你应该把程序写得思路更清晰一些。
最外层的while循环的判断条件为什么是ivec.size() != 0。你内层的for假若能将ivec清空,那么外层while只能执行一遍。
你的for循环应该弃用迭代器并改成while,用类似于ivec.size() != 0的判断方法
你的END是三维数组,而最外层的数组从来没有添加过元素,为何会直接取END[cnt]


这是一个爬取的我们市某个品牌所有的单车位置信息,进行区域平衡规划。要进行很多次遍历,每一次的遍历都会得到一个数据簇,相当于重新得到了一个区域。
最里层的一维vector是存取的每辆单车的位置坐标,二维vector,ivec存取的是所有单车的位置信息。三维vector存取的是二维的数据簇,是优化得到的,所以预先设定三维vector是空的。

位置距离计算从几米到几十公里不等,所以不会一次遍历完。

程序运行崩溃一直提示vector subscript out of range 。我自己写了一个小小的程序测试的erase崩溃的提示是vector iterator not incrementable

#7


引用 6 楼 jiuzhibuguniao 的回复:
Quote: 引用 5 楼 srhouyu 的回复:

Quote: 引用 4 楼 jiuzhibuguniao 的回复:

Quote: 引用 1 楼 srhouyu 的回复:

你若是erase了最后一个元素,那么新的q恰好等于end(),下次q++,仍然满足q!=end(),但已经超出范围。


但是这个应该怎么改呢,我改了还是一样报错


我搞不清楚你的思路,所以说的不一定正确,但是你应该把程序写得思路更清晰一些。
最外层的while循环的判断条件为什么是ivec.size() != 0。你内层的for假若能将ivec清空,那么外层while只能执行一遍。
你的for循环应该弃用迭代器并改成while,用类似于ivec.size() != 0的判断方法
你的END是三维数组,而最外层的数组从来没有添加过元素,为何会直接取END[cnt]


这是一个爬取的我们市某个品牌所有的单车位置信息,进行区域平衡规划。要进行很多次遍历,每一次的遍历都会得到一个数据簇,相当于重新得到了一个区域。
最里层的一维vector是存取的每辆单车的位置坐标,二维vector,ivec存取的是所有单车的位置信息。三维vector存取的是二维的数据簇,是优化得到的,所以预先设定三维vector是空的。

位置距离计算从几米到几十公里不等,所以不会一次遍历完。

程序运行崩溃一直提示vector subscript out of range 。我自己写了一个小小的程序测试的erase崩溃的提示是vector iterator not incrementable


那很可能是END为空的情况下直接取END[cnt]的缘故。若是要往END中添加元素,不要END[cnt]=...,用END.push_back()才行。

#1


你若是erase了最后一个元素,那么新的q恰好等于end(),下次q++,仍然满足q!=end(),但已经超出范围。

#2


代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。

#3


引用 1 楼 srhouyu 的回复:
你若是erase了最后一个元素,那么新的q恰好等于end(),下次q++,仍然满足q!=end(),但已经超出范围。


但是这样应该怎么改呢,我改了还是不行

#4


引用 1 楼 srhouyu 的回复:
你若是erase了最后一个元素,那么新的q恰好等于end(),下次q++,仍然满足q!=end(),但已经超出范围。


但是这个应该怎么改呢,我改了还是一样报错

#5


引用 4 楼 jiuzhibuguniao 的回复:
Quote: 引用 1 楼 srhouyu 的回复:

你若是erase了最后一个元素,那么新的q恰好等于end(),下次q++,仍然满足q!=end(),但已经超出范围。


但是这个应该怎么改呢,我改了还是一样报错


我搞不清楚你的思路,所以说的不一定正确,但是你应该把程序写得思路更清晰一些。
最外层的while循环的判断条件为什么是ivec.size() != 0。你内层的for假若能将ivec清空,那么外层while只能执行一遍。
你的for循环应该弃用迭代器并改成while,用类似于ivec.size() != 0的判断方法
你的END是三维数组,而最外层的数组从来没有添加过元素,为何会直接取END[cnt]

#6


引用 5 楼 srhouyu 的回复:
Quote: 引用 4 楼 jiuzhibuguniao 的回复:

Quote: 引用 1 楼 srhouyu 的回复:

你若是erase了最后一个元素,那么新的q恰好等于end(),下次q++,仍然满足q!=end(),但已经超出范围。


但是这个应该怎么改呢,我改了还是一样报错


我搞不清楚你的思路,所以说的不一定正确,但是你应该把程序写得思路更清晰一些。
最外层的while循环的判断条件为什么是ivec.size() != 0。你内层的for假若能将ivec清空,那么外层while只能执行一遍。
你的for循环应该弃用迭代器并改成while,用类似于ivec.size() != 0的判断方法
你的END是三维数组,而最外层的数组从来没有添加过元素,为何会直接取END[cnt]


这是一个爬取的我们市某个品牌所有的单车位置信息,进行区域平衡规划。要进行很多次遍历,每一次的遍历都会得到一个数据簇,相当于重新得到了一个区域。
最里层的一维vector是存取的每辆单车的位置坐标,二维vector,ivec存取的是所有单车的位置信息。三维vector存取的是二维的数据簇,是优化得到的,所以预先设定三维vector是空的。

位置距离计算从几米到几十公里不等,所以不会一次遍历完。

程序运行崩溃一直提示vector subscript out of range 。我自己写了一个小小的程序测试的erase崩溃的提示是vector iterator not incrementable

#7


引用 6 楼 jiuzhibuguniao 的回复:
Quote: 引用 5 楼 srhouyu 的回复:

Quote: 引用 4 楼 jiuzhibuguniao 的回复:

Quote: 引用 1 楼 srhouyu 的回复:

你若是erase了最后一个元素,那么新的q恰好等于end(),下次q++,仍然满足q!=end(),但已经超出范围。


但是这个应该怎么改呢,我改了还是一样报错


我搞不清楚你的思路,所以说的不一定正确,但是你应该把程序写得思路更清晰一些。
最外层的while循环的判断条件为什么是ivec.size() != 0。你内层的for假若能将ivec清空,那么外层while只能执行一遍。
你的for循环应该弃用迭代器并改成while,用类似于ivec.size() != 0的判断方法
你的END是三维数组,而最外层的数组从来没有添加过元素,为何会直接取END[cnt]


这是一个爬取的我们市某个品牌所有的单车位置信息,进行区域平衡规划。要进行很多次遍历,每一次的遍历都会得到一个数据簇,相当于重新得到了一个区域。
最里层的一维vector是存取的每辆单车的位置坐标,二维vector,ivec存取的是所有单车的位置信息。三维vector存取的是二维的数据簇,是优化得到的,所以预先设定三维vector是空的。

位置距离计算从几米到几十公里不等,所以不会一次遍历完。

程序运行崩溃一直提示vector subscript out of range 。我自己写了一个小小的程序测试的erase崩溃的提示是vector iterator not incrementable


那很可能是END为空的情况下直接取END[cnt]的缘故。若是要往END中添加元素,不要END[cnt]=...,用END.push_back()才行。