С++ динамический размер массива
У меня есть небольшая проблема с 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]
}
}