c ++ динамический размер массива - PullRequest
9 голосов
/ 02 ноября 2010

У меня небольшая проблема с 1D массивом в c ++.У меня есть строка функции это:

void func(int (&array)[???])
{
    // some math here;

    "for" loop {
        array[i] = something;
    }
}

Я вызываю функции где-то в коде, и прежде чем я сделаю математику, я не могу знать размерность массива.Массив поступает в функцию в качестве ссылки !, потому что он мне нужен в функции main ().Как я могу выделить массив, как это ?, так что массив с ??измерение идет в функцию в качестве ссылки, тогда я должен поместить измерение и записать в него некоторые значения.

Ответы [ 6 ]

14 голосов
/ 02 ноября 2010

Поскольку вы используете C ++, почему бы не использовать std::vector<> вместо этого?

10 голосов
/ 02 ноября 2010

Другие упоминали, что вы должны использовать std::vector в C ++, и они правы.

Но вы можете заставить свой код работать, сделав func шаблоном функции.

template <typename T, size_t N>
void func(T (&array)[N])
{
    // some math here;

    "for" loop {
        array[i] = something;
    }
}
9 голосов
/ 02 ноября 2010

Используйте указатель, а не ссылку:

void func(int *a, int N);

Или, проще, используйте вектор:

void func(std::vector<int> &a);

Векторы можно выделить, просто сказав

std::vector<int> a(10);

Количество элементов можно получить с помощью a.size().

5 голосов
/ 02 ноября 2010

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

0 голосов
/ 02 ноября 2010

Что вы должны понять, так это то, что массивы являются указателями. Определение типа int array[5] выделит место для 5 целых чисел в стеке, а array будет адресом первого значения. Таким образом, для доступа к первому значению в массиве вы можете написать

array[0] или *array (что совпадает с *(array + 0))

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

&array[2] или array + 2

Поскольку массивы являются указателями, вам не нужно беспокоиться о размере времени выполнения вашего массива, если вы хотите передать его функции, просто передайте его как указатель: void func(int *array) { int size; //compute size of the array for (int i = 0; i < size; ++i) { //do whatever you want with array[i] } }

0 голосов
/ 02 ноября 2010

Помимо вектора, который был предложен, вы можете использовать valarray, который также является частью STL и предназначен специально для обработки математических коллекций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...