启动/停止排序算法的C++矢量内存错误

C++ vector memory errors for a start/stop sorting algorithm

本文关键字:C++ 内存 错误 算法 排序 启动      更新时间:2023-10-16

我有两个问题,第一,下面的代码由于内存或未初始化的位置错误而随机退出,我就是看不到它。第二,我不确定算法是否正确。(该算法被认为是为任何关心的人模拟汉伯里-布朗-特维斯光子实验)

矢量由线性增加的时间戳组成,其中停止信号延迟180秒,如果第i个启动信号小于第i个停止信号,则计时器启动,忽略所有启动信号,直到计时器遇到停止信号,反之亦然,如果计时器停止,则应忽略所有停止,直到登记启动。然后,代码应该对这些启动/停止之间的时间差进行桶式排序。

-如果有这种类型的名字,请在下面发布。

下面的代码采用这些填充的矢量,并尝试模拟这个过程。但在我重新修复算法之前,我无法弄清楚内存问题出了什么问题。

这是我的代码,它并不总是有效的,它适用于小于10000倍的开始/停止向量,但我需要它迭代到100000倍。

   while( starts.size() > 5 && stops.size() > 5 ){
      if( start.at(0) >= stop.at(0) ){
         thisStart = starts.at(0);
      }
      j=0;
      while( stops.at(j) <= starts.at(0) ){
         j++;
      }
      stops.erase(stops.begin(), stops.begin() + j + 1 );
      thisStop = stops.at(0);
      j=0;
      while( starts.at(j) <= thisStop){
         j++;
      }
      starts.erase(starts.begin(), starts.begin() + j+1 );
      bucketSort(thisStop - thisStart, bins, &counts);
   }
while( stops.at(j) <= starts.at(0) ){
         j++;
      }

如果这个循环在stops中找不到小于或等于starts[0]的元素,那么它将越界。会抛出一个out_of_range异常,这就是at()应该做的。我不知道这是否是你的问题,因为你没有具体说明你得到了什么样的错误,但这肯定是需要查找的。

你可能想要这样的条件:

while (j < stops.size() && stops[j] <= starts[0]) { ... }