当前位置: 首页 > 知识库问答 >
问题:

Std排序使Std::vector无效

汝臻
2023-03-14

我在std::sort中发现了一个bug,特别是在一些QuickSort的实现中,我不知道问题是否出在一般的算法中。

精华:

当元素小于16时,所有的规范都被替换,因为std::sort使用插入排序。

当有17个或更多的元素时,使用快速排序,并从元素数量的对数限制递归深度,但向量在第一次__introsort_loop迭代时有时间恶化。

当有许多相同的元素时,就会出现向量损坏。用无效迭代器替换有效迭代器时发生损坏。

其他容器也可能破裂,我没有检查。

对于更复杂的对象,使用类型为“int”的向量简化示例-排序时崩溃,因为无效对象被传递给比较函数:

#include <iostream>
#include <vector>
#include <algorithm>

void quickSort(int arr[], int left, int right) {
  int i = left, j = right;
  int tmp;
  int pivot = arr[(left + right) / 2];

  /* partition */

  while (i <= j) {
        while (arr[i] < pivot)
              i++;
        while (arr[j] > pivot)
              j--;
        if (i <= j) {
              tmp = arr[i];
              arr[i] = arr[j];
              arr[j] = tmp;
              i++;
              j--;
        }
  };

  /* recursion */

  if (left < j)
        quickSort(arr, left, j);

      if (i < right)
            quickSort(arr, i, right);
}

int main()
{
  for( int i = 0 ; i < 1 ; i++ )
  {
    //std::vector<int> v({5, 6, 1, 6, 2, 6, 3, 6, 4, 4, 4, 4, 4, 6, 6, 6, 6, 6, 6});//reproducible with this
    std::vector<int> v(19, 6);//reproducible with this also
    std::sort(std::begin(v), std::end(v), [&v]( const int & left, const int & right )
                                          {
//                                          std::cout << " left=" << left << ", right=" << right << std::endl;
                                            bool b = left <= right;
                                            return b;
                                          }
              );
//    quickSort(v.data(), 0, v.size());
 for( const auto & result : v )
 {
    std::cout << "results: " << result << std::endl;
 }
  }

  std::cout << "Hello World!\n";
}

有人会遇到这种行为吗?

共有2个答案

鲜于宜修
2023-03-14

我试过你的代码,似乎问题出在用构造函数向量(n,val)(fill构造函数)创建的向量上。当手动插入16、17、18和19个随机元素时,向量显示没有问题。

郎鸿
2023-03-14

你必须在开始上课时保存支点,比如

void快速排序(int-arr[],int-left,int-right){int i=left,j=right;int-pivot=x[left];之后就可以工作了

 类似资料:
  • 下面的代码显示了我要做的:

  • 错误:无法将类型为“std::_bit_reference&”的非常量lvalue引用绑定到类型为“std::vector::reference”{aka“std::_bit_reference”}的rvalue 因此,它抱怨,因为只有第二个参数是rvalue

  • 要检查向量是否为空,我可以使用或。我查看了cplike上的签名,但缺乏理解它们的知识。它们如何相互关联?一个实现调用另一个实现吗? 我知道其中一个来自容器库,另一个来自迭代器库,但仅此而已。

  • https://godbolt.org/z/P97MaK 我玩的概念和预期d::is_equality_comparable工作矢量,但它没有。 编译错误在 内部失败,而不是在受概念保护的函数边界处失败。 这是错误还是预期行为?

  • 我正在用Qt编写一个图像查看器。我试图在头文件中执行以下操作: 在源文件中: 然而,我得到了以下错误: 在非类类型int[10]的缩放中请求成员开始,在非类类型int[10]的缩放中请求成员结束 有人知道如何初始化这个静态const private成员吗?

  • 我以前见过这样做,但我不记得如何有效地初始化已知长度的与长度相同的。这里有一个很好的例子: 我已经仔细阅读了这一页关于高级矩阵初始化的内容,但是没有明确解释执行此操作的方法。