在C ++中将数组作为参数传递

时间:2009-04-18 18:01:17

标签: c++ arrays parameters merge arguments

我正在编写一个合并排序函数,现在我只是使用一个测试用例数组(没有输入 - 这是静态的,现在)。我不知道如何将数组作为参数传递。这是我现在的代码:

//merge sort first attempt

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

int mergeSort(int[]);
int main()
{
int originalarray[] = {1, 3, 5, 7, 9, 2, 4, 6, 8, 10};
mergeSort(originalarray[]);
}

int mergeSort(int[] originalarray)
{
int num = (sizeof(originalarray)/sizeof(int));
std::vector<int> original(num);

if (num > 2) {
    return num;
}

// Fill the array using the elements of originalarray
// This is just for demonstration, normally original will be a parameter,
// so you won't be filling it up with anything.
std::copy(originalarray, originalarray + num, original.begin());

// Create farray and sarray of the appropriate size
std::vector<int> farray(num / 2);
std::vector<int> sarray(num - farray.size());

// Fill those using elements from original
std::copy(original.begin(), original.begin() + farray.size(), farray.begin());
std::copy(original.begin() + farray.size(), original.end(), sarray.begin());

mergeSort(farray);
mergeSort(sarray);    

}

请注意,这个mergeSort函数不起作用,因为我还没有弄清楚如何合并它们(这是我的任务)。我想在处理之前对我的两个向量进行排序,因为我需要将数组作为参数传递,所以无法编译。我不明白指针,所以如果这是解决方案,我的借口就是无知。我正在学习编程,使用C ++作为第一语言,并且只能基本掌握语言的功能。谢谢你的帮助。

7 个答案:

答案 0 :(得分:30)

答案 1 :(得分:18)

你不应该那样使用sizeof(originalarray)/sizeof(int)。它只适用于静态声明的数组(大小在编译时是已知的)。你必须传递它的大小。为什么不直接从数组中取出vector并传递它?

旁注:根据经验,请务必注意sizeof将在编译时进行翻译。所以它无法知道作为参数传递的数组的大小。

答案 2 :(得分:3)

我看到你包括<vector>。我建议你不要使用数组的所有用途,只使用vector类。您可以查看如何使用STL容器的示例,例如vector here

答案 3 :(得分:2)

  • 当您将数组传递给函数时,它们会衰减到指向数组的第一个元素的指针,尽管有这种符号。因此,您的sizeof无法按预期工作。

  • 传入数组时,最好传入数组大小,以便知道停止的位置。将其添加为附加参数。

答案 4 :(得分:0)

除了上述所有答案之外,您可能还想查看来自c-faq.com的Q&amp; As on数组:http://c-faq.com/aryptr/index.html

答案 5 :(得分:0)

不幸的是,要用C或C ++完成你想做的事情是很难的。您可以传递一个固定大小的数组:

int mergeSort(int originalarray[20])
{
    // do something
}

但是,数组的大小不是由数字定义的,而是由初始化列表中的元素数定义。

在你的情况下要做的事情(尽管这确实是一件坏事)是分两步完成的:

int originalarray[] = {1, 3, 5, 7, 9, 2, 4, 6, 8, 10};
const size_t arraySize = sizeof originalarray / sizeof originalarray[0];
int mergeSort(int array[arraySize])
{
    // do something
}

太糟糕了,它不会做你需要做的事情:将数组传递给这样的函数会产生数组的副本,排序点就是改变原始数组。

事实上,如果不理解“指针”的概念,你就不能再进一步了。

你需要开发的功能应该是这样的:

int originalarray[] = {1, 3, 5, 7, 9, 2, 4, 6, 8, 10};
const size_t arraySize = sizeof originalarray / sizeof originalarray[0];

int mergeSort(int *array, const size_t size)
{
    // do something
}

mergeSort(&(originalArray[0]), arraySize);

换句话说,您将指针传递给第一个元素和元素数。

或者,您可以处理向量。 Vector在一个名为“object”的实体中封装了相同的两件事(指向第一个元素和大小的指针)。此外,它还为您管理内存,因此您可以根据需要扩展元素数量。这是C ++的方式。太糟糕了,你不能用{...}来初始化一个矢量,就像你可以用数组一样。

答案 6 :(得分:0)

看起来你正在使用动态分配的数组和向量,当我相信只使用std :: vector就足够了。

首先,让您的输入数组更改为std :: vector,并用输入数据填充它。

int main()
{
   std::vector<int> originalarray;
   for (int data = 1; data <= 10; data++)
   {
      originalarray.push_back(data);
   }
   mergeSort(originaldata);
}

现在声明你的mergesort函数来引用std :: vector是很重要的。

int mergeSort(std::vector<int>& originalarray)
{
   // The rest of your code, note that now you are passing 
   // in your array for sorting, so you can continue with your code to split
   // the vector into farray and sarray

   // then call sort on your halves.
   mergeSort(farray);
   mergeSort(sarray);

   // I'm guessing at this point you'd write code to combine your farray sarray, and
   // put it back into originalarray...don't forget to clear original array first!
}

只是一个注释,看起来你没有做一个就地排序,所以期待你的排序需要一段时间,因为你要复制大量的数据。