Обработка длин многомерных массивов в C ++ - PullRequest
1 голос
/ 23 октября 2011

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

В любом случае, мне было интересно, можно ли вернуть массив в c ++ ... Я начал программировать с помощью javascript, поэтому первым решением, о котором я подумал, было сделать что-то вроде

int gen(int len){
    return int arr(int a[][len]){
        cout << a[0][0];
    };
}

Я знал, что это не сработает, попробовал и не удивился, когда это не сработало. Есть ли способ сделать что-то подобное?

Ответы [ 2 ]

2 голосов
/ 23 октября 2011

В C ++ вы можете передавать массив по ссылке. Сделав массив template, можно получить любую длину в функции. Например,

template<size_t SIZE1>
void print (int (&arr)[SIZE1])
{ ... }

template<size_t SIZE1, size_t SIZE2>
void print (int (&arr)[SIZE1][SIZE2])
{ ... }

template<size_t SIZE1, size_t SIZE2, size_t SIZE3>
void print (int (&arr)[SIZE1][SIZE2][SIZE3])
{ ... }

Этот шаблон внутренне создаст уникальную функцию для каждого размера массива. Он предлагает простоту использования, но может увеличить размер кода.

1 голос
/ 23 октября 2011

Вы должны знать размер массива, нет никакого способа обойти это.std::vector является правильным способом решения этой проблемы, и вы можете найти хорошую ссылку здесь .Это позволяет передавать только вектор, так как он знает свою собственную длину, и функция может задать его, делая его похожим на то, к чему вы привыкли в Javascript.

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

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

...