С++ динамический размер массива

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

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

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

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

Ответ 1

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

void func(int *a, int N);

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

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

Векторы могут быть выделены простым произношением

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

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

Ответ 2

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

Ответ 3

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

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

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

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

Ответ 4

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

template <class T, size_t N>
void func(T(&array)[N])
{
    size_t array_length = N; // or just use N directly
}

int main() 
{
    int array[4];
    func(array);
}

Тем не менее, как уже отмечали другие, std::vector, вероятно, является лучшим решением здесь.

Ответ 5

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

Ответ 6

Что вы должны понимать, так это то, что массивы являются указателями. Определение типа 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]
    }
}