这是我程序的一个片段,它采用整数列表A,一些查询 Q(要排序的列表中的一系列范围)和索引k。列表根据查询排序,然后打印出 k 索引。
具体来说:
从(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()它是什么。
答案 0 :(得分:2)
for(sit; sit!=sortedSegments.end(); ++it)
你实际上并没有迭代。你的迭代变量是我猜的是一个错字