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 ответа:
Для этого не нужны файлы. Несмотря на то, что обычные файловые системы в операционных системах в наши дни довольно хорошо сопоставлены с памятью (во многих случаях это будет их кэш) с задержкой подкачки на диск, взаимодействие с файловой системой может сделать ваш код гораздо более неэффективным, так как вы пишете на диск.
Поскольку вы отметили этот вопрос с помощью 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; }