【问题标题】:Merge sort C++ help Dynamically allocates temporary array for merged numbers合并排序 C++ 帮助 为合并的数字动态分配临时数组
【发布时间】:2019-12-02 00:20:25
【问题描述】:

我正在尝试做一个家庭作业问题,我必须使用教科书合并排序方法并将其实现到我的程序中。当我尝试为合并的数字动态分配临时数组时,我无法让它工作。

void Merge(int *numbers, int i, int j, int k)
{
int mergedSize = k - i + 1;         
int merge2 = k - j;
int mergePos = 0;                       
int leftPos = 0;                       
int rightPos = 0;                     
int mergedNumbers = new int[mergedSize];    
leftPos = i;                        
rightPos = j + 1;     

我收到一个 int 错误,提示我无法在 "int mappedNumbers = new int[mergedSize];" 中初始化 int 类型的实体。 我该如何解决这个问题才能让它发挥作用。

【问题讨论】:

  • new 表达式的返回值是 int * 类型而不是 int。也可以考虑改用std::vector
  • 这行得通。谢谢

标签: c++ arrays sorting mergesort


【解决方案1】:

new 返回一个指向已分配数组的第一个元素的指针。您正在尝试将其分配给不是指针的int

您应该将new 表达式的结果分配给指向int 的指针:

int* mergedNumbers = new int[mergedSize];

或者更简单,你可以让编译器确定类型,这样你就不用输入两次了:

auto mergedNumbers = new int[mergedSize];

但请注意,mergedNumbers 在任何一种情况下都是指针,并且必须按原样使用(例如,使用数组索引语法)。

当你不再需要分配的数组时不要忘记delete[]指针,否则你会泄漏内存:

delete[] mergedNumbers;

但是,对于动态大小的临时数组,不会使用手动动态内存,而是使用std::vector<int>。将new/delete 用于这样的事情是不好的风格,因为它容易出错,不是异常安全的,并且不遵循称为Resource Acquisition Is Initialization (RAII) 的C++ 编程风格的基本概念之一

std::vector<int> mergedNumbers(mergedSize);

如果可以,请使用它(需要#include&lt;vector&gt;)。如果你的导师不允许这样做,那将是非常不幸的,因为它会教你一种在实践中没有使用的糟糕的 C++ 风格。

【讨论】:

  • 作为替代方案,我认为一次性分配与要排序的数组大小相同的工作数组没有问题,因为通常会以相同的方式分配和删除两者.然后对两个数组的引用(指针)将作为 mergesort() 和 merge() 的参数包含在内。另一种选择是 std::array,但我不知道使用 std::array 与 std::vector 相比是否有优势。
  • @rcgldr 你的意思是基本上调用者提供了临时数组?我想这在调用者需要控制内存分配方式的某些特殊情况下是有意义的,但在大多数情况下,调用者并不关心排序函数是否分配。这也有点危险,因为调用者需要保证匹配的大小。我最多将其用作可选功能。不知道你指的是哪个函数,问题里只有Merge
  • @rcgldr std::array 需要编译时已知大小。如果这个函数应该对任意大小的数组进行排序,那么std::vector 是要走的路。当使用固定大小时,它在性能上实际上等于原始分配,但即使抛出异常也能保证正确删除,并且始终使用.size() 提供正确的大小,并且除了在复制或传递时(而原始数组没有)。
  • 我忘记了 std::array 有一个编译时间大小,但我没有看到调用者提供的临时数组有问题,查看 std::stable_sort 的 Visual Studio 2015 代码,确实如此一次性为输入容器大小的一半分配一个内部容器; | _Iter_diff_t<_bidit> _Count = _STD 距离(_First, _Last); | _Temp_iterator<_iter_value_t>> _Tempbuf((_Count + 1) / 2); | .容器的成员包括_First()、_Last()、_Maxlen()。 std::stable_partition 分配整个容器 | ... _Tempbuf(_Count ); | .
  • @rcgldr 我认为有误会。我对此没有任何问题。我的理解是您指的是算法本身的调用者,即std::stable_sort 的用户提供临时缓冲区。有充分的理由只分配一次缓冲区,我并不是说这是一个问题。
猜你喜欢
  • 2010-10-15
  • 2013-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多