C++ хранение массива в отдельном файле


Я работаю над программой на 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

Очевидно, что этот код является просто макетом, и функции сортировки не имеют отношения к этому вопросу, кроме того факта, что вызов функции сортировки изменяет исходный массив. Спасибо за вашу помощь.

3 3

3 ответа:

Для этого не нужны файлы. Несмотря на то, что обычные файловые системы в операционных системах в наши дни довольно хорошо сопоставлены с памятью (во многих случаях это будет их кэш) с задержкой подкачки на диск, взаимодействие с файловой системой может сделать ваш код гораздо более неэффективным, так как вы пишете на диск.

Поскольку вы отметили этот вопрос с помощью C++ , я отвечу на этот вопрос способом C++ (или, по крайней мере, способом стандартной библиотеки C++). То, что вы хотите, это сделать копию массив, когда вы передаете его в функции. В данный момент Вы передаете необработанный адрес массива, поэтому вы не делаете никаких копий (возможно, только копию указателя). Этот процесс упрощается, если вы используете векторы . Таким образом, программа может быть

#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;
}

Ну, вы должны сделать другой массив. Скопируйте содержимое исходного массива в этот с помощью memcpy() или используйте цикл.

Вы можете объявить свой массив как const, так что он сохраняет свое начальное значение и функции не изменяют его.