C++ 在单独的文件中存储数组

C++ Storing Array in Separate File

我正在开发一个 C++ 程序,在该程序中我必须将一个数组传递给多个排序函数并比较这些函数的 运行 次。例如,我有一个包含 100 个元素的数组,其中包含从 1 到 10 的随机数。我有冒泡排序、归并排序和快速排序函数,我必须将数组传递给每个函数。但是,当我传递数组时,第一个排序函数会更改原始数组,以便在传递给下一个函数时它已经排序。这是预料之中的,但我想知道如何将这个数组存储在一个单独的文件中,也许是一个头文件,以使每个函数调用的原始数组保持未排序。

这是我的代码布局:

#include <iostream>
using namespace std;

//void bubblesort, mergesort, quicksort function prototypes

int main()
{
    int a[100];
    for (int i = 0; i < 100; i++)
        a[i] = rand() % 10 + 1;
    bubblesort(a);
    mergesort(a);
    quicksort(a);
    return 0;
}

//void bubblesort, mergesort, quicksort function definitions

这段代码显然只是一个布局,除了调用排序函数会更改原始数组这一事实外,排序函数与此问题无关。感谢您的帮助。

您可以将数组声明为 const,这样它会保留初始值并且函数不会更改它。

嗯,你应该再做一个数组。使用 memcpy() 或使用循环将原始数组的内容复制到此数组。

您不需要为此提供文件。尽管现在操作系统上的常用文件系统都很好地映射到内存(在许多情况下这将是它们的缓存)并延迟交换到磁盘,但与文件系统交互可能会使您的代码效率低得多,因为您正在写入磁盘。

既然你用 C++ 标记了这个问题,我将以 C++ 方式(或至少以 C++ 标准库方式)回答这个问题。您想要的是在将数组传递给函数时制作数组的副本。目前您正在传递数组的原始地址,因此您没有制作任何副本(可能只是指针的副本)。如果您使用 vectors,这个过程会变得简单。所以程序可以是

#include <iostream>
#include <vector>
using namespace std;

// The declarations would just need to change to this, I am assuming 
// they print to stdout
void bubblesort(vector<int> vec);
void mergesort(vector<int> vec);
void quicksort(vector<int> vec);

int main()
{
    vector<int> a;
    for (int i = 0; i < 100; i++)
        a.push_back(rand() % 10 + 1);
    bubblesort(a);
    mergesort(a);
    quicksort(a);
    return 0;
}

此处向量将按值传入,因此函数访问的向量是原始向量的副本。向量的特点是它们更灵活,在大多数高级编程场景中通常比数组更受欢迎。

但是,如果您的应用程序需要使用低级数组,您可以使用 memcpy 来实现这种复制效果。

#include <iostream>
#include <vector>
using namespace std;

//void bubblesort, mergesort, quicksort function prototypes

int main()
{
    int a[100];
    for (int i = 0; i < 100; i++)
        a[i] = rand() % 10 + 1);

    int for_bubble_sort[100];
    memcpy(for_bubble_sort, a, 100);
    bubblesort(for_bubble_sort);

    int for_merge_sort[100];
    memcpy(for_merge_sort, a, 100);
    mergesort(for_merge_sort);

    int for_quick_sort[100];
    memcpy(for_quick_sort, a, 100);
    quicksort(for_quick_sort);
    return 0;
}