2014-10-24 2 views
-3

Как перебирать по x и y (без изменения его в вектор) в следующем определении.Iterating Over Массивы неизвестного размера в функции-члене

class MinimumSquareEasy 
{ 

public: 

    long minArea(int[] x, int[] y) 
    { 

    //ITERATION 

    } 

}; 
+0

'minArea' даже не имеет действительной декларации. Квадратные скобки должны появиться после имени переменной. –

ответ

1

int x[] в качестве аргумента то же самое, как int * x - у вас есть указатель, который не передает никакой информации о длине массива вы могли бы пройти в Таким образом, вы не можете перебирать его как. массив, потому что у вас нет информации, чтобы решить, когда прекратить итерацию.

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

В качестве альтернативы вы можете потребовать, чтобы входные массивы были завершены с некоторым количеством дозорных значений. Например, если это значение-опознавание равно -1, вы можете сразу перебрать оба массива с помощью этой конструкции, которая остановит итерацию, когда она достигнет значения часового в либо массива, что означает, что вы будете перебирать количество элементов в наименьшее из двух массивов:

for (; *x != -1 && *y != -1; ++x, ++y) { 
    // Use *x and *y 
} 

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

+0

Я не могу принять никаких дополнительных аргументов. Я ограничен этим определением. – shubhamr

+0

@shubhamr Если вы не можете изменить подпись метода, ваша задача невозможна. – cdhowie

+0

Многие вопросы о topcoder просят нас использовать эти типы определений. Это должно быть каким-то образом. – shubhamr

0

В НЕКОТОРЫХ реализации распределителя МОЖЕТ добавить размер выделенного буфера непосредственно перед фактическим буфером.
Это иногда используется для оператора delete [], чтобы узнать, сколько байтов освободится.
НЕКОТОРЫЕ компиляторы добавляют переменную sizeof(int) с размером.

BUT Это всего лишь функция реализации, и не гарантируется существование.
Можно перегрузить новые [] и удалить [] операторы.
Или компилятор может реализовать новые [] и удалить [] с внутренней картой, которая использует адрес с ключом, поэтому у вас не будет никакой информации о размере, просто глядя на буфер.

Это опасно и, конечно же, не что-то определенное в стандарте.

+1

И выделенный стеком массив не будет выделен с помощью 'new []', поэтому, если кто-то пройдет один, вы будете ввернуты. – cdhowie

Смежные вопросы