Другие языки, такие как Java и Python, хранят длину массивов во время выполнения.В массивах C ++ длина массива не сохраняется.Это означает, что вам нужно где-то хранить его вручную.
Всякий раз, когда в вашем коде есть массив фиксированного размера, компилятор знает размер массива, так как он читает его из самого исходного кода.Но как только код скомпилирован, информация о длине теряется.Например:
void f1(double array[10]) {...}
Компилятор не будет применять размер массива.Следующий код будет автоматически скомпилирован, поскольку параметр массива f1
использует просто указатель на первый элемент массива:
void h1() {
double a[10];
double b[5];
f1(a); // OK.
f2(b); // Also OK.
}
Поскольку компилятор игнорирует статический размер массива при передаче его вфункция, единственный способ узнать размер массива произвольного размера, переданного в качестве ссылки, это явно указать размер:
void f2(double array[], size_t array_size) {...}
Затем вы можете вызвать эту функцию с любым массивом:
void h2() {
double a[10];
double b[19];
f2(a, sizeof(a) / sizeof(a[0]));
f2(b, sizeof(a) / sizeof(a[0]));
}
Параметр array_size
содержит фактический размер массива.
Как примечание, sizeof(array)
работает только со статически определенными массивами.Когда вы передаете этот массив другим функциям, информация о размере теряется.
Массив не совпадает с указателем.Однако массив неопределенного размера, такой как параметр f2
, является просто указателем на первый элемент double
в последовательности:
void f3(double array*, size_t array_size) {...}
Для любых практических целей, f2
и f3
эквивалентны.
Именно так и работает std::vector
.Внутренне вектор - это класс с двумя полями: указатель на первый элемент и количество элементов в векторе.Это немного упрощает задачу, если вы хотите принять массив любого размера в качестве параметра:
void g(std::vector& v) {...}