std :: sort如何处理重复的数字? [重复]

问题描述 投票:-1回答:1

当我测试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去哪里。

谁可以解释std :: sort在这些情况下如何工作?
c++ algorithm sorting stl
1个回答
0
投票
您使用lambda创建了无效的比较器函数,应该使用<而不是<=,否则sort()会继续交换相等的元素。
© www.soinside.com 2019 - 2024. All rights reserved.