Как вернуть двумерный массив в исходную форму после сортировки? - PullRequest
0 голосов
/ 11 марта 2019

Я пытаюсь сбросить 2D-массив в его первоначальную форму после сортировки с помощью пузырьковой сортировки.Мне нужно сбросить его обратно к тому, что было до сортировки.Как мне это сделать?В случае, если у вас есть вопрос, почему массив является глобальным.Это школьное задание, и именно поэтому наш профессор хочет, чтобы мы это делали.Вот моя программа:

 #include<iostream>

    using namespace std;
    const int NUM_COLS=4;
    const int NUM_ROWS=5;       

    int array[NUM_ROWS][NUM_COLS]={{5, 3, 2, 16},
                            {9, 8, 10, 17},
                            {4, 7, 11, 18},
                            {2, 5, 9, 12},
                        {7, 9, 4, 10}};

сортирует массив с bubbleSort

void bubbleSort(int row, int col){}

это заголовок функции отображения массива

void displayArray(){}

и вот основная функция

int main(){



        cout<<"original array"<<endl;
        displayArray();

        bubbleSort(NUM_ROWS-1, NUM_COLS);
        cout<<"\nbubble sort"<<endl;
        displayArray();

        reset();
        displayArray();
        return 0;
    }

Теперь мне нужно вернуть массив в исходное состояние.Я сделал это, но это не работает.

void reset(){

 int array[NUM_ROWS][NUM_COLS]={{5, 3, 2, 16},
                                {9, 8, 10, 17},
                                {4, 7, 11, 18},
                                {2, 5, 9, 12},
                                {7, 9, 4, 10}};
}

Ответы [ 3 ]

2 голосов
/ 11 марта 2019

Ваш reset объявляет новый массив (и ничего не делает с ним). Вы не можете назначить (=) массивы в стиле C, поэтому вам нужно что-то, что выглядит по-другому. Если вместо этого вы можете использовать std::array, вы можете назначить reset.

#include <array>

const int NUM_COLS=4;
const int NUM_ROWS=5;       

std::array<std::array<int, NUM_ROWS>, NUM_COLS> values = {
    {5, 3, 2, 16},
    {9, 8, 10, 17},
    {4, 7, 11, 18},
    {2, 5, 9, 12},
    {7, 9, 4, 10}};

// Other code probably remains unchanged

void reset() {
    values = {
        {5, 3, 2, 16},
        {9, 8, 10, 17},
        {4, 7, 11, 18},
        {2, 5, 9, 12},
        {7, 9, 4, 10}};
}

В этот момент вы замечаете, что у вас неправильные границы, и это должно быть либо

const int NUM_COLS=5;
const int NUM_ROWS=4;       

или инициализатор массива другой формы.

0 голосов
/ 11 марта 2019

Как я сказал в комментарии, самый простой способ назначить массивы - это обернуть их в структуру. Вуаля, внезапно C ++ развивает способности, которые он даже не знал, что унаследовал от C, и копирует массивы! 1 Даже вложенные многомерные массивы!

#include <iostream>
#include <iomanip>
#include <algorithm>
using namespace std;

const int NUM_COLS=4;
const int NUM_ROWS=5;       

// Define a struct (i.e., a class with all public members)
// which has just a single member, the array. Note that this is
// only a *type* declaration, no object is created yet.
struct arrT
{
  int array [NUM_ROWS][NUM_COLS];
};

// object creation.
arrT workArr;

void reset()
{
  // The initialization value is hidden inside the function.
  // static variables are initialized only once, for constant 
  // data at compile time.
  static const arrT oriArr 
  {
    { {5, 3, 2, 16},
      {9, 8, 10, 17},
      {4, 7, 11, 18},
      {2, 5, 9, 12},
      {7, 9, 4, 10}
    }
  };

  workArr = oriArr; // simple default assignment of structs
}

// The parameters are redundant.
void stdSort(int /*row*/, int /*col*/)
{ 
  // Sort the 2D array as a one-dimensional sequence
  // (which the elements are in memory).
  // The algorithm expects iterators to the first and
  // one-after-the-last elements in the sequence. Pointers
  // to the elements in an array are perfectly good iterators.
  std::sort(&workArr.array[0][0], &workArr.array[NUM_ROWS-1][NUM_COLS]);
}

void displayArray()
{
  // The top-level elements of a 2D array are the rows...
  for(auto &row: workArr.array)
  {
    // ... and the elements of the rows are ints. 
    // Note how the
    // dimensions are known from the class declaration.
    for(auto &el: row)
    {
      cout << setw(4) << el;
    }
    cout << "\n";
  }
}

int main(){

  cout << "Work array before initialization:\n";
  displayArray();

  reset(); // before, the values of the global array are 0.
  cout<<"\nWork array after init:\n";
  displayArray();

  stdSort(NUM_ROWS, NUM_COLS);
  cout<<"\nWork array after std sort"<<endl;
  displayArray();

  reset();
  cout << "\nWork array after reset\n";
  displayArray();
  return 0;
}


1 Массивы являются единственным известным мне примером, когда приписанное к членству назначение сгенерированного оператора присваивания по умолчанию может присваивать тип, у которого нет отдельного оператора присваивания (именно поэтому мы прыгать через этот обруч). Есть ли другие?
0 голосов
/ 11 марта 2019
void reset(){
  static int original[NUM_ROWS][NUM_COLS]={{5, 3, 2, 16},
                                {9, 8, 10, 17},
                                {4, 7, 11, 18},
                                {2, 5, 9, 12},
                                {7, 9, 4, 10}};

  for (int i = 0; i < NUM_ROWS; i++)
    memcpy(array[i], original[i], NUM_COLS * sizeof(int));
}

Не самая красивая вещь, но это должно работать. Так как ваш профессор хочет, чтобы вы это делали, сделайте это ¯ \ _ (ツ) _ / ¯

...