2016-03-10 74 views
3

我正在研究一個C++程序,其中我必須將數組傳遞給多個排序函數並比較函數的運行時間。例如,我有一個包含100個元素的數組,其中包含從1到10的隨機數。我有一個冒泡排序,合併排序和快速排序功能,我必須將數組傳遞給每個函數。但是,當我傳遞數組時,第一個排序函數會更改原始數組,以便當它傳遞給下一個函數時,它已經排序。這是預期的,但我想知道如何將這個數組存儲在一個單獨的文件中,也許是一個頭文件,以保持每個函數調用的原始數組未被分類。C++將數組存儲在單獨的文件中

這裏是我的代碼佈局:

#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 

此代碼顯然只是一個佈局和排序功能是不相關的,就只給一個排序函數的調用改變其他這個問題原始數組。謝謝你的幫助。

+1

只要將數組複製到一個新的數組變量,每次你想排序。無需將其保存到文件中。看看'memcpy()'或者寫一個for循環。 –

回答

1

你不需要這個文件。儘管當前操作系統上的文件系統很好地映射到內存(在很多情況下,這將是它們的緩存),並延遲交換到磁盤,但與文件系統交互可能會使您的代碼更加低效,因爲您正在寫入磁盤。

既然你用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; 
} 
+0

你的第二個代碼示例在函數聲明中仍然有'vector' – vu1p3n0x

+0

@ vu1p3n0x謝謝你指出! – Curious

+0

謝謝@Curious! – tfreiner

-2

你可以聲明你的數組爲const,所以它保留它的初始值並且函數不會改變它。

0

那麼,你應該做另一個數組。使用memcpy()將原始數組的內容複製到這個數組中,或使用循環。

相關問題