Вычислительная длина массива

Если Ваш набор не может возвратить индекс объекта с помощью некоторого метода, единственный путь состоит в том, чтобы использовать счетчик как в Вашем примере.

Однако при работе с индексами, единственный разумный ответ на проблему должен использовать для цикла. Что-либо еще представляет сложность кода, не говоря уже о сложности времени и пространства.

5
задан Maxpm 30 November 2011 в 13:22
поделиться

10 ответов

Да. В случае, если объявленный тип элемента когда-либо изменится, вы также можете написать

int iLength = sizeof(carray)/sizeof(carray[0]);
17
ответ дан 18 December 2019 в 05:13
поделиться

Read this article by Ivan J. Johnson in Dr. Dobbs Journal. I think it covers most of the solutions presented here. It also outlines the merits and demerits of each approach very nicely.

0
ответ дан 18 December 2019 в 05:13
поделиться

Windows SDK (т.е. заголовок windows.h) предлагает макрос ARRAYSIZE, который реализует эту функциональность безопасным способом (т.е. не работает с нестатическими массивами)

0
ответ дан 18 December 2019 в 05:13
поделиться

Вы можете использовать следующий шаблон функции. Если вы используете Boost, вы можете вызвать boost :: size .

template <typename T, std::size_t N>
std::size_t size(T (&)[N])
{
    return N;
}

int iLength = size(carray);

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

24
ответ дан 18 December 2019 в 05:13
поделиться

Этот код верен, но в большинстве случаев есть более эффективные способы обработки массивов в C ++. Тем более, что этот метод не будет работать с массивами динамического размера.

В таких случаях используйте класс стандартной библиотеки std :: vector , который представляет массив динамического размера (т.е. вы можете вставлять и удалять записи ).

5
ответ дан 18 December 2019 в 05:13
поделиться

То есть правильно, так как здесь используется метапрограммирование:

template <typename T, std::size_t N>
inline std::size_t array_size( T (&)[N] ) {
   return N;
};

Вы должны знать, что это работает, когда компилятор видит определение массива, но не после того, как оно было передано функции (где оно распадается на указатель):

void f( int array[] )
{
   //std::cout << array_size( array ) << std::endl; // fails, at this point array is a pointer
   std::cout << sizeof(array)/sizeof(array[0]) << std::endl; // fails: sizeof(int*)/sizeof(int)
}
int main()
{
   int array[] = { 1, 2, 3, 4, 5 };
   f( array );
   std::cout << array_size( array ) << std::endl; // 5
   std::cout << sizeof(array)/sizeof(array[0]) << std::endl; // 5 
}
6
ответ дан 18 December 2019 в 05:13
поделиться

Да, это правильный способ сделать это, но он будет работать только в этой ситуации, когда размер массива известен во время компиляции и его можно увидеть на сайте оператор sizeof (array) . Он не будет работать с массивами динамического размера - вам понадобятся другие методы для них, например, использование контейнера, такого как stl :: vector, или передача / сохранение количества элементов в качестве отдельного параметра.

1
ответ дан 18 December 2019 в 05:13
поделиться

Лучший способ - использовать макрос и использовать его там, где вам нужен размер.

#define MAX_ROWS 1048
int array[MAX_ROWS];

Таким образом, вы можете использовать MAX_ROWS даже в функции, где массив передается как аргумент .

0
ответ дан 18 December 2019 в 05:13
поделиться

Если у вас есть динамический массив, вам, вероятно, следует использовать что-то вроде вектора STL. http://www.cppreference.com/wiki/stl/vector/start

Обычные массивы в C ++ имеют фиксированный размер, и вам необходимо вручную выделить память для расширения динамических.

Если вы знаете размер своего массива во время компиляции, используйте константу, а не вычисление.

0
ответ дан 18 December 2019 в 05:13
поделиться

Это не время выполнения, это время компиляции. Вы используете правильный способ. Обратите внимание, что Visual Studio определяет функцию _countof , которая делает то же самое.

Во время выполнения длина не может быть определена. Вы либо сами сохраняете длину, либо используете std :: vector

0
ответ дан 18 December 2019 в 05:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: