Iterator for-loop不会确认循环完成条件

时间:2017-08-11 03:57:00

标签: c++

这是我程序的一个片段,它采用整数列表A,一些查询 Q(要排序的列表中的一系列范围)和索引k。列表根据查询排序,然后打印出 k 索引。

具体来说:

  • 整数列表为[8,5,3,9,2,4,3,1,9,7]
  • 查询列表为[(0,1),(3,4),(0,4)]
  • 指数k为3

从(0,1),然后(3,4),最后(0,4)排序A给出最终的整数列表[2,3,5,8,9,4,3,1,9 ,7]其中 k th索引是8,并且打印出这个数字。

在对整数范围进行排序后,记录该范围以避免不必要地多次排序相同的范围。这些记录的范围存储在变量sortedSegments中。

在根据查询对A进行排序之前,for循环将遍历sortedSegments以查看排序A by的新范围是否已经排序。问题是for循环在迭代遍历所有sortedSegments之后应该没有退出。

它无法退出循环的原因我无法弄清楚,所以我想我会在这里发布,所以有人可以指出我不可避免的明显错误:

    typedef vector<pair<int,int>>   pairVec;

    bool hasOverlappingRange(pair<int,int> r1, pair<int,int> r2) {
         return (r1.first)<=(r2.second) && (r1.second)>=(r2.first);
    }

    pairVec sortedSegments;

    pairVec::iterator sit = sortedSegments.begin();
    for(sit; sit!=sortedSegments.end(); ++it) 
    { // iterate through the known ordered segments, check if query overlaps one.
        if(hasOverlappingRange( {lowIdx,highIdx} , *sit)){
            sortPortion(a, {lowIdx, highIdx}, *sit);
            segmentSorted = true;
        }
        // This is where the program breaks
    }

    if (!segmentSorted) {
        sortPortion(a, {lowIdx,highIdx},{-1,-1});
        sortedSegments.push_back( {lowIdx,highIdx} );
    }

我在整个代码中插入了打印行以观察程序的执行情况,在运行此详细版本的代码后,输出为:

Pre-sort  A:  8 5 3 9 2 4 3 1 9 7 Segments: [] This Q: (0,1)
done checking all sorted segments
seg not sorted yet
uP:  5 sP:  8
seg sorted
new idx pushed onto segments
Post-sort A:  5 8 3 9 2 4 3 1 9 7 Segments: [ (0, 1)]

Pre-sort  A:  5 8 3 9 2 4 3 1 9 7 Segments: [ (0, 1)] This Q: (3,4)
checking if Q(3,4) overlaps (0,1)
no overlapping region here

但程序永远不会完成,程序在退出for循环时失败。我通过手动递增迭代器来测试退出条件,在迭代器中它将由循环本身递增,并检查迭代器是否等于sortedSegments.end()它是什么。

1 个答案:

答案 0 :(得分:2)

    for(sit; sit!=sortedSegments.end(); ++it) 

你实际上并没有迭代。你的迭代变量是我猜的是一个错字