C++ 合并排序C++;帮助为合并的数字动态分配临时数组

C++ 合并排序C++;帮助为合并的数字动态分配临时数组,c++,arrays,sorting,mergesort,C++,Arrays,Sorting,Mergesort,我正在尝试做一个家庭作业,我使用了课本合并排序方法,并将其实现到我的程序中。当我尝试为合并的数字动态分配临时数组时,我无法让它工作 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;

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

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类型的实体“int mergedNumbers=new int[mergedSize];”
如何修复此问题以使其正常工作。

new
返回指向所分配数组的第一个元素的指针。您正试图将其分配给一个
int
,该int不是指针

您应该将
新表达式的结果指定给指向
int
的指针:

int* mergedNumbers = new int[mergedSize];
或者更简单地说,您可以让编译器确定类型,这样就不必键入两次:

auto mergedNumbers = new int[mergedSize];
但是请注意,
mergedNumbers
在任何情况下都是指针,因此必须使用它(例如,与数组索引语法一起使用)

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

delete[] mergedNumbers;

但是,对于动态大小的临时数组,我们不会使用手动动态内存,而是使用
std::vector
。使用<代码>新< /COD> >代码>删除< /代码>,因为它容易出错,不例外安全,不遵循C++编程风格的一个基本概念,即“< /p>”。
std::向量合并编号(mergedSize);

如果可以,请使用它(需要
#包括
)。如果你的老师不允许,那将是非常不幸的,因为它会教你一个不被实践中使用的坏的C++风格。

你的<代码>新的< /COD>表达式的返回值是“代码> int *<代码>不是<代码> int >代码>。也可以考虑使用<代码> STD::向量< /代码>。这是有效的。谢谢,作为替代方案,我不认为一次性分配与要排序的数组大小相同的工作数组有问题,因为这两个数组通常会以相同的方式分配和删除。然后,对这两个数组的引用(指针)将作为mergesort()和merge()的参数包含在内。另一种选择是std::array,但我不知道使用std::array与std::vector相比是否有优势。@rcgldr您的意思是基本上调用方提供了临时数组?我想这在某些特殊情况下是有意义的,在这些情况下,调用者需要控制如何分配内存,但在大多数情况下,调用者并不关心排序函数是否分配内存。这也有点危险,因为调用者需要保证匹配的大小。我最多会将其用作可选功能。我不知道您指的是哪些函数,问题中只有
Merge
。@rcgldr
std::array
需要编译时已知大小。如果这个函数应该对任意大小的数组进行排序,那么
std::vector
就是一种方法。当与固定大小一起使用时,它在性能上实际上等同于原始分配,但即使引发异常,它也保证正确删除,并且始终使用
.size()
提供正确的大小,并且除了复制或传递时,它的行为与用户的行为相同(而原始数组不会)。我忘了std::array有编译时大小,但我看不出调用方提供的临时数组有任何问题,查看Visual Studio 2015 std::stable_sort的代码,它一次性为输入容器大小的一半分配内部容器;|_Iter_diff_t_Count=_标准距离(_First,_Last);|_Temp_迭代器_Tempbuf((_Count+1)/2);|。容器的成员包括_First()、_Last()、_Maxlen()。std::stable|u分区分配整个容器|_Tempbuf(_Count);|@我想是误会了。我对此没有任何问题。我的理解是,您指的是算法本身的调用方,即提供临时缓冲区的
std::stable_sort
用户。有充分的理由只分配一次缓冲区,我并不是说这是一个问题。
std::vector<int> mergedNumbers(mergedSize);