Как я могу использовать функцию поиска в динамическом массиве? - PullRequest
0 голосов
/ 29 октября 2018

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

Есть ли способ отредактировать мой динамический массив, чтобы он стал постоянным? Или также возможно создать функцию поиска, которая использует динамический массив (и не будет выдавать ошибки?). Я кратко расскажу о своем коде:

Я динамически создаю массив, используя строки, которые я прочитал из файла, а затем динамически выделяю каждую строку массиву столбцов.

char ** domain[] = new char * [rows];

for(int i = 0; i < rows; i++)
{
    *domain = new char[columns];  
    domain++;  
}

Тип функции, которую нас учили для поиска: ``

char searchArray( const char list[], char letter, int maxSize)
{
    >code goes here  
}

Есть ли другой метод использования функции поиска, которая принимает динамические многомерные массивы?

В ответ на комментарии я не могу использовать векторы. Это задание для нас, чтобы использовать обычные массивы. Меня еще не учили, как использовать векторы.

1 Ответ

0 голосов
/ 29 октября 2018

В строке

char ** domain[] = new char * [rows];

char ** domain[] пытается создать массив char **. Если компилятор не жаловался на отсутствие допустимого размера массива в [], и у вас была бы трехмерная структура. Вы хотите просто старый char ** для 2D-структуры, поэтому

char ** domain = new char * [rows];

Цикл, заполняющий внутреннее измерение, является правильным, за исключением того, что он теряет путь к начальной точке domain

for(int i = 0; i < rows; i++)
{
    *domain = new char[columns];  
    domain++;  
} 

Должно быть что-то вроде

char ** temp = domain;

for(int i = 0; i < rows; i++)
{
    *temp = new char[columns];
    temp++;
}

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

for(int i = 0; i < rows; i++)
{
    domain[i] = new char[columns];
}

На searchArray. Нужно знать, что он получает два измерения (const char **) и что существует два максимальных размера (maxRow и maxColumn). Это будет выглядеть примерно так:

char searchArray(const char ** list, 
                 char letter, 
                 int maxRow, 
                 int maxColumn)
{
    >code goes here  
}

Код здесь - это ваша проблема, но, вероятно, это будут два вложенных цикла for, повторяющихся в maxRow и maxColumn и возвращающихся при обнаружении letter.

Но ... зачем возвращать char? Возвращение местоположения в массиве гораздо полезнее. Мы могли бы использовать std::pair, но если std::vector запрещен, pair, вероятно, также. Вместо этого рассмотрим что-то вроде следующего:

struct coord
{
    int row;
    int column;
};

coord searchArray(const char ** list, 
                  char letter, 
                  int maxRow, 
                  int maxColumn)
{
    coord location;
    >code goes here
    return location;
}

Если элемент не найден, установите для row и column значение, которое невозможно получить равным -1, чтобы можно было легко проверить наличие не найденного случая.

Остановитесь здесь, если вы не хотите <толкование удалено> с умом вашего учителя.

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

Решение состоит в том, чтобы создать одномерный массив и сделать его похожим на как двумерный массив. Вот пример этого из C ++ FAQ

Из этого примера вы узнаете много полезных вещей, не последним из которых являются RAII и Правило трех , два понятия, без которых вы не можете написать не тривиальный высококачественный код C ++.

...