当我测试std :: sort函数来处理一个填充有重复数字的向量时,我发现确实有些令人困惑。
例如,这是一段C ++代码。
#include <ctime>
#define startTime std::clock_t stTime = clock()
#define endTime std::clock_t edTime = clock()
#define processTime static_cast<double>(edTime - stTime) / CLOCKS_PER_SEC
#include <bits/stdc++.h>
using namespace std;
int main() {
int i = 0;
vector<int> v;
while (i != 1000000) {
v.push_back(2);
++i;
}
startTime;
sort(begin(v), end(v), [](const int& lhs, const int& rhs) { return lhs <= rhs; });
endTime;
cout << processTime;
system("pause");
}
当我没有将包括<=的lambda表达式传输到std :: sort时,一切进展顺利。但是,在我实际执行此操作时会发生各种异常。在这种情况下,发生了细分错误。有时,编译器无法删除vector中的元素。
经过彻底检查后,我发现STL文件中可能会发生某些事情:
//stl_algo.h
/// This is a helper function...
template<typename _RandomAccessIterator, typename _Compare>
_RandomAccessIterator
__unguarded_partition(_RandomAccessIterator __first,
_RandomAccessIterator __last,
_RandomAccessIterator __pivot, _Compare __comp)
{
while (true)
{
while (__comp(__first, __pivot))
++__first;
--__last;
while (__comp(__pivot, __last))
--__last;
if (!(__first < __last))
return __first;
std::iter_swap(__first, __last);
++__first;
}
}
__pivot
是__first+1
的地方
虽然比较__first
和__pivot
时,该语句始终为[[true,所以我们不知道__first
去哪里。
<
而不是<=
,否则sort()
会继续交换相等的元素。