Я понял, что sizeof(arr)/sizeof(arr[0])
возвращает размер массива, а не фактическое количество элементов в массиве.
int main(void)
{
int a = 1;
int b = 2;
int arr[5] = {a, b};
int arrcount = sizeof(arr)/sizeof(arr[0]);
printf("Array Size: %d\n", arrcount);
return EXIT_SUCCESS;
}
arrcount
здесь равно 5. Есть ли способ получить количество элементов равным 2
в этом сценарии без изменения размера массива?
Непонятно, что вы подразумеваете под "количеством элементов". В этом массиве пять элементов. Вы имеете в виду количество ненулевых элементов? Может быть, вы действительно хотите std::vector
.
int arr[5] = {a, b};
просто уберите 5
здесь. Это не требуется, когда вы присваиваете литерал массива.
Размер массива и количество элементов одинаковы. Массивы представляют собой контейнеры фиксированного размера.
Как только вы разберетесь с остальным, вам может пригодиться совершенно новая функция std::size
.
@chris, что, если бы массив был не типа int, а типа объекта, а a
и b
были бы этого типа объекта. Будут ли они по-прежнему равны 0?
@xcmer, отсутствующие - это инициализированное значением, что, вероятно, в этом случае равнозначно вызову конструктора по умолчанию.
I realized that
sizeof(arr)/sizeof(arr[0])
returns the size of the array and not the actual number of elements in the array.
Когда вы говорите фактическое количество элементов в массиве, я думаю, вы имеете в виду количество элементов, которые были явно инициализированы чем-то отличным от нуля.
Единственный способ сделать это - перебрать элементы массива и подсчитать количество элементов, которые проходят определенный фильтр.
int count = 0;
for ( int item : arr )
{
if ( item != 0 ) // This is a filter
++count;
}
Стандартная библиотека предоставляет для этого функцию std::count_if
.
int count = std::count_if (std::begin(arr), std::end(arr),
[](int item) -> bool { return item != 0; });
Ваш массив содержит
1 2 0 0 0
. 0 все еще существуют.