Если Ваш набор не может возвратить индекс объекта с помощью некоторого метода, единственный путь состоит в том, чтобы использовать счетчик как в Вашем примере.
Однако при работе с индексами, единственный разумный ответ на проблему должен использовать для цикла. Что-либо еще представляет сложность кода, не говоря уже о сложности времени и пространства.
Да. В случае, если объявленный тип элемента когда-либо изменится, вы также можете написать
int iLength = sizeof(carray)/sizeof(carray[0]);
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.
Windows SDK (т.е. заголовок windows.h) предлагает макрос ARRAYSIZE, который реализует эту функциональность безопасным способом (т.е. не работает с нестатическими массивами)
Вы можете использовать следующий шаблон функции. Если вы используете 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. .
Этот код верен, но в большинстве случаев есть более эффективные способы обработки массивов в C ++. Тем более, что этот метод не будет работать с массивами динамического размера.
В таких случаях используйте класс стандартной библиотеки std :: vector
, который представляет массив динамического размера (т.е. вы можете вставлять и удалять записи ).
То есть правильно, так как здесь используется метапрограммирование:
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
}
Да, это правильный способ сделать это, но он будет работать только в этой ситуации, когда размер массива известен во время компиляции и его можно увидеть на сайте оператор sizeof (array)
. Он не будет работать с массивами динамического размера - вам понадобятся другие методы для них, например, использование контейнера, такого как stl :: vector, или передача / сохранение количества элементов в качестве отдельного параметра.
Лучший способ - использовать макрос и использовать его там, где вам нужен размер.
#define MAX_ROWS 1048
int array[MAX_ROWS];
Таким образом, вы можете использовать MAX_ROWS даже в функции, где массив передается как аргумент .
Если у вас есть динамический массив, вам, вероятно, следует использовать что-то вроде вектора STL. http://www.cppreference.com/wiki/stl/vector/start
Обычные массивы в C ++ имеют фиксированный размер, и вам необходимо вручную выделить память для расширения динамических.
Если вы знаете размер своего массива во время компиляции, используйте константу, а не вычисление.
Это не время выполнения, это время компиляции. Вы используете правильный способ. Обратите внимание, что Visual Studio определяет функцию _countof
, которая делает то же самое.
Во время выполнения длина не может быть определена. Вы либо сами сохраняете длину, либо используете std :: vector