2013-04-07 4 views

ответ

6

Вы можете использовать std::begin и std::end, если у вас есть 11 поддержка C++ .:

int len = std::end(array)-std::begin(array); 
// or std::distance(std::begin(array, std::end(array)); 

В качестве альтернативы, вы пишете собственную функцию шаблона:

template< class T, size_t N > 
size_t size(const T (&)[N]) 
{ 
    return N; 
} 

size_t len = size(array); 

Это будет работать в C + +03. Если бы вы использовали его на C++ 11, то стоило бы сделать его constexpr.

+5

Или 'станд :: степень :: value'. –

+0

@ sftrabbit Я даже не думал об этом. Ницца! – juanchopanza

+1

@sftrabbit Сделайте **, что ** ответ и получите мой +1 –

4

Используйте sizeof() -оператора как в

int size = sizeof(array)/sizeof(array[0]); 

или лучше использовать std::vector, поскольку он предлагает std::vector::size().

int myints[] = {16,2,77,29}; 
std::vector<int> fifth (myints, myints + sizeof(myints)/sizeof(int)); 

Here является документом. Рассмотрим пример на основе диапазона.

+0

Можно ли определить 'std :: vector' с initializaiton (как в моем примере с обычным массивом)? – NPS

+1

C++ 11 предлагает инициализаторы. В противном случае вы можете создать массив, как вы это делали, и назначить его std :: vector. Ill post the doc за минуту –

+0

Это выражение уровня C не следует рекомендовать, не объясняя [его тип небезопасности и как это можно исправить] (http://stackoverflow.com/questions/4810664/how-do-i-use- массивы-в-с/7439261 # 7439261). –

2

Как это:

int size = sizeof(array)/sizeof(array[0]) 
+0

Я знал это, но я думал, что это может не работать с 'std :: string' (из-за переменной длины текста). – NPS

+2

Это выражение уровня C не следует рекомендовать, не объясняя [его тип небезопасности и как это можно исправить] (http://stackoverflow.com/questions/4810664/how-do-i-use-arrays-in-c/7439261 # 7439261). –

+0

@NPS 'sizeof (std :: string)' всегда одно и то же; это не имеет никакого отношения к тому, сколько символов хранится в строке –

3

C++ 11 предоставляет std::extent, который дает вам количество элементов вдоль N го измерения массива. По умолчанию N является 0, так что это дает вам длину массива:

std::extent<decltype(array)>::value 
+0

Выполняет ли это все вычисления во время компиляции (т. е. после компиляции это просто число, не требующее дополнительных вычислений)? – NPS

+0

@NPS: да, вы можете видеть это из-за того, что это тип –

+0

Любой способ сделать его коротким (например, макросом, но я бы не использовал макросы)? – NPS

Смежные вопросы