De onde vem a matriz? Normalmente, as funções que recebem matrizes também usam um parâmetro de comprimento para lidar com esse problema.
Michael Myers
2
Bem, estou criando um programa "mad libs" que possui uma matriz com todo o texto, bem como os locais dos substantivos / verbos que o usuário precisa preencher. Gostaria de usar uma função para percorrer o matriz inteira, substituindo os valores "[noun]" e "[verb]" pelo texto inserido pelo usuário.
Observe que em matrizes C não são objetos ou estruturas. Como tal, eles não têm parâmetro de comprimento armazenado em qualquer lugar por padrão. Se você deseja trabalhar com eles como objetos em C ++, use objetos em C ++ std :: vector ou std :: array do C ++ 11, se puder. Se você precisar usar ponteiros, sempre passe o comprimento da matriz como segundo parâmetro para todas as funções que funcionam com ela.
Pihhan
Se você estiver usando C ++ 20, adicionei uma resposta para isso também. Pode ser esquecido facilmente, pois há muitas respostas aqui.
gprathour
Respostas:
511
Se você quer dizer uma matriz no estilo C, pode fazer algo como:
int a[7];
std::cout <<"Length of array = "<<(sizeof(a)/sizeof(*a))<< std::endl;
Isso não funciona em ponteiros (ou seja , não funciona em nenhum dos seguintes):
int*p =newint[7];
std::cout <<"Length of array = "<<(sizeof(p)/sizeof(*p))<< std::endl;
Ele também não funciona se você passar a matriz para uma função diferente e tentar fazê-lo lá :)
San Jacinto
23
@ San Jacinto: Não, isso funciona (em matrizes ), não importa em que função você esteja. Passar uma matriz de comprimento variável para uma função como parâmetro, no entanto, é impossível (ela se deteriora em um ponteiro) - mas se você passar um matriz dentro de uma estrutura, então isso funciona como esperado.
precisa
1
@OliverCharlesworth também se você passou o array por valor para outra função e tentou por lá, ele não funcionará, certo? A questão é por que
A_Matar
5
@A_Matar - Você não pode passar uma matriz por valor em C ou C ++.
Oliver Charlesworth
1
@ yusha - são a mesma coisa.
26716 Oliver Oliverworth
142
Como já foi dito, você pode usar o, sizeof(arr)/sizeof(*arr)mas isso fornecerá a resposta errada para os tipos de ponteiro que não são matrizes.
Isso tem a boa propriedade de não compilar para tipos que não são de matriz (o visual studio possui o _countofque faz isso). O constexprtorna uma expressão de tempo de compilação, para que não tenha desvantagens sobre a macro (pelo menos nenhuma que eu conheça).
Você também pode considerar o uso std::arraydo C ++ 11, que expõe seu comprimento sem sobrecarga sobre uma matriz C nativa.
O C ++ 17 tem std::size()no <iterator>cabeçalho o mesmo e funciona para contêineres STL (graças a @Jon C ).
@yau é como você escreve uma referência a uma matriz , veja esta resposta . Minha versão parece um pouco diferente, pois deixei de fora o nome do parâmetro, pois o parâmetro não é usado, apenas seu tipo é necessário. Com um nome seria T(arg&)[N].
Motti 10/01
1
Obrigado Motti! O nome do parâmetro deixado de fora já estava claro para mim. Mas inacreditável que eu aparentemente não usasse referências / ponteiros para matrizes de antes. E provavelmente não o fará no futuro, pois essas matrizes estão morrendo ainda mais.
@IsaacPascual eu não estava familiarizado extent, olhando para ele agora existem duas características que o tornam menos útil do que a função acima (para este caso de uso). (1) Retorna zero para ponteiros (em vez de um erro de compilação). (2) Ele requer um parâmetro de tipo, portanto, para verificar uma variável que você teria que fazer, decltype
Motti
86
Doing sizeof( myArray )você receberá o número total de bytes alocados para essa matriz. Você pode descobrir o número de elementos na matriz dividindo pelo tamanho de um elemento na matriz:sizeof( myArray[0] )
Esta é uma solução muito simples e fácil de superar o que parece ser um problema antigo.
4
Não funciona para matrizes "novas" do C ++ mantidas por um ponteiro. Você obtém o tamanho do ponteiro (4 bytes) ou o tamanho do seu primeiro elemento, se o derereferenciar.
DragonLord 5/02
1
@DragonLord sim, embora alguém que declare o tamanho da matriz usando a palavra-chave new já saiba o tamanho da matriz em tempo de execução, portanto, não há necessidade de usar o operador sizeof para encontrar o tamanho da matriz nesse caso. Tenho certeza que você sabe disso. Isso é apenas para o benefício de quem não o faz.
Martyn Shutt
@surega Não vai falhar
CITBL
60
Embora essa seja uma pergunta antiga, vale a pena atualizar a resposta para C ++ 17. Na biblioteca padrão, agora existe a função de modelo std::size(), que retorna o número de elementos em um contêiner std ou em uma matriz no estilo C. Por exemplo:
Isso não iria funcionar para tamanhos de matriz individuais variáveis
Don Laringe
4
+1 para vetores. Há muito poucos casos fortes para usar as matrizes C ++ à moda antiga. A menos que o tamanho da matriz nunca mude, mas mesmo assim, você deve usar a classe de contêiner da matriz. É melhor usar uma classe de contêiner como vetor para armazenamento em matriz dinâmica. Os profissionais do uso de classes de contêiner superam os contras de ter que gerenciar sua própria memória.
Martyn Shutt
@MartynShutt Quando você está vinculado ao cache, como no gamedev, às vezes não pode dar ao luxo de usar um vetor.
Tara
30
std::vectorpossui um método size()que retorna o número de elementos no vetor.
Eu acredito que este só funciona para variáveis locais que estão na pilha.
DragonLord 5/02
Esta é a melhor resposta. @DragonLord, também funciona para vários membros. Veja cpp.sh/92xvv .
Shital Shah 30/08/19
24
Desde o C ++ 11, alguns novos modelos são introduzidos para ajudar a reduzir a dor ao lidar com o comprimento da matriz. Todos eles são definidos no cabeçalho <type_traits>.
Se Tfor um tipo de matriz, fornece o valor constante do membro igual ao número de elementos ao longo da Nth dimensão da matriz, se Nestiver em [0, std::rank<T>::value). Para qualquer outro tipo, ou se a Tmatriz de desconhecida estiver ligada ao longo de sua primeira dimensão e Nfor 0, o valor será 0.
Se Tfor uma matriz de algum tipo X, fornece o tipo de membro typedef igual a X, caso contrário, o tipo é T. Observe que se Tfor uma matriz multidimensional, somente a primeira dimensão será removida.
Em C ++, usando a classe std :: array para declarar uma matriz, é possível encontrar facilmente o tamanho de uma matriz e também o último elemento.
#include<iostream>#include<array>int main(){
std::array<int,3> arr;//To find the size of the array
std::cout<<arr.size()<<std::endl;//Accessing the last elementauto it=arr.end();
std::cout<<arr.back()<<"\t"<<arr[arr.size()-1]<<"\t"<<*(--it);return0;}
Agradável; Vejo que você tem muitas habilidades; e ... ótima abordagem. Eu acho que deveria escrever mais respostas a tais perguntas famosos mim, também ;-)
GhostCat
5
Essa é uma pergunta praticamente antiga e lendária e já existem muitas respostas incríveis por aí. Porém, com o tempo, novas funcionalidades são adicionadas aos idiomas; portanto, precisamos continuar atualizando as coisas de acordo com os novos recursos disponíveis.
Acabei de notar que alguém ainda não mencionou o C ++ 20. Então, pensei em escrever resposta.
C ++ 20
No C ++ 20, há uma nova maneira melhor adicionada à biblioteca padrão para encontrar o comprimento da matriz, ie std:ssize(). Esta função retorna a signed value.
Apenas para sua informação, se você se pergunta por que essa abordagem não funciona quando o array é passado para outra função . A razão é,
Uma matriz não é passada por valor em C ++, mas o ponteiro para a matriz é passado. Como em alguns casos, passar todas as matrizes pode ser uma operação cara. Você pode testar isso passando a matriz para alguma função e fazendo algumas alterações na matriz lá e, em seguida, imprima a matriz no main novamente. Você obterá resultados atualizados.
E como você já deve saber, a sizeof()função fornece o número de bytes; portanto, em outra função, ele retornará o número de bytes alocados para o ponteiro, em vez de toda a matriz. Portanto, essa abordagem não funciona.
Mas tenho certeza de que você pode encontrar uma boa maneira de fazer isso, conforme sua exigência.
ARRAYSIZE (arr) funciona inspecionando sizeof (arr) (o número de bytes na matriz) e sizeof (* (arr)) (o número de bytes em um elemento da matriz). Se o primeiro é divisível pelo último, talvez arr seja de fato uma matriz; nesse caso, o resultado da divisão é o número de elementos na matriz. Caso contrário, arr não pode ser uma matriz e geramos um erro do compilador para impedir a compilação do código.
Como o tamanho do bool é definido pela implementação, precisamos converter! (Sizeof (a) & sizeof (* (a))) em size_t para garantir que o resultado final tenha o tipo size_t.
Essa macro não é perfeita, pois aceita erroneamente certos ponteiros, a saber, onde o tamanho do ponteiro é divisível pelo tamanho do ponteiro. Como todo o nosso código precisa passar por um compilador de 32 bits, em que um ponteiro tem 4 bytes, isso significa que todos os ponteiros para um tipo cujo tamanho é 3 ou maior que 4 serão (justamente) rejeitados.
com uma matriz de números inteiros como este: int nombres[5] = { 9, 3 };esta função retorna em 5vez de 2.
Anwar
GOOGLE_ARRAYSIZE(new int8_t)retorna 8no meu ambiente de teste, em vez de gerar erro. A peça fundida parece redundante, sem mencionar a macro C gritante. sizeof(a) / sizeof(*a)funciona o suficiente como solução legada.
3
Para C ++ / CX (ao escrever, por exemplo, aplicativos UWP usando C ++ no Visual Studio), podemos encontrar o número de valores em uma matriz simplesmente usando a size()função
Embora esse trecho de código possa resolver o problema, ele não explica por que ou como responde à pergunta. Inclua uma explicação para o seu código, pois isso realmente ajuda a melhorar a qualidade da sua postagem. Lembre-se que você está respondendo a pergunta para os leitores no futuro, e essas pessoas podem não saber as razões para a sua sugestão de código
Balagurunathan Marimuthu
3
RESPOSTA :
int number_of_elements =sizeof(array)/sizeof(array[0])
EXPLICAÇÃO :
Como o compilador coloca um pedaço de memória de tamanho específico de lado para cada tipo de dados e uma matriz é simplesmente um grupo desses, você simplesmente divide o tamanho da matriz pelo tamanho do tipo de dados. Se eu tiver uma matriz de 30 strings, meu sistema separará 24 bytes para cada elemento (string) da matriz. Com 30 elementos, isso representa um total de 720 bytes. 720/24 == 30 elementos. O algoritmo pequeno e rígido para isso é:
int number_of_elements = sizeof(array)/sizeof(array[0]) o que equivale a
number_of_elements = 720/24
Observe que você não precisa saber que tipo de dados é a matriz, mesmo que seja um tipo de dados personalizado.
Não há necessidade dessa abordagem antiquada e propensa a erros em 2019. stackoverflow.com/a/59109106/560648 Além disso, é apenas uma bobagem das respostas existentes.
Lightness Races em órbita
É, no entanto, simples, eloquente, rápido, de baixa demanda, independente de plataforma e elimina a necessidade de incluir vetores ou ponteiros. No que diz respeito a enganar outras respostas, parece haver apenas uma outra resposta com o mesmo algoritmo, e essa não dá explicação sobre a mecânica subjacente do problema como a minha resposta. Eu respeitosamente sugiro que, em vez de propenso a erros, seja bastante robusto.
Bob Warner
1
Apenas um pensamento, mas apenas decidimos criar uma variável de contador e armazenar o tamanho do array na posição [0]. Eu apaguei a maior parte do código que tinha na função, mas você verá que, após sair do loop, prime [0] recebe o valor final de 'a'. Tentei usar vetores, mas o VS Express 2013 não gostou muito disso. Observe também que 'a' começa com um para evitar a substituição [0] e é inicializado no início para evitar erros. Não sou especialista, apenas pensei em compartilhar.
int prime[]={0};int primes(int x,int y){usingnamespace std;int a =1;for(int i = x; i <= y; i++){prime[a]= i; a++;}
prime[0]= a;return0;}
@bobbogo Trabalha com inline ou constexpr, talvez você tenha desativado o inline ou é opcional? ideone.com/VxogJ4
QuentinUK
@QentinUK constexpré a correção. inlinenão é. constexpré bastante moderno. Você tem certeza de que seu programa de teste não está usando outro recurso moderno, onde você pode declarar uma matriz local cujo comprimento é fornecido por uma variável? Experimente com duas matrizes globais.
22419 bobbogo
1
Para o antigo compilador g ++, você pode fazer isso
Isso funciona apenas quando arré de um tipo compatível inte a matriz não excede o valor máximo do tipo. Por exemplo, seqüências de caracteres Pascal são realmente matrizes de bytes usando esse truque; o comprimento máximo de seqüências de caracteres em Pascal é de 255 caracteres.
Palec
Suponho que se possa reservar, digamos, 8 bytes no início de cada array e usar um longo sem sinal se eles quiserem armazenar objetos. Eu acho que um vetor é provavelmente mais fácil. Mas definitivamente uma boa solução para sistemas embarcados.
aj.toulan
1
você pode encontrar o comprimento de uma matriz seguindo:
int arr[]={1,2,3,4,5,6};int size =*(&arr +1)- arr;
cout <<"Number of elements in arr[] is "<< size;return0;
Eu, pessoalmente, sugeriria (se você não conseguir trabalhar com funções especializadas por qualquer motivo) expandir primeiro a compatibilidade do tipo de matrizes além do que você usaria normalmente (se estivesse armazenando valores ≥ 0:
unsignedint x[]->int x[]
do que você tornaria o elemento da matriz 1 maior do que o necessário. Para o último elemento, você colocaria algum tipo incluído no especificador de tipo expandido, mas que normalmente não usaria, por exemplo, usando o exemplo anterior, o último elemento seria -1. Isso permite que você (usando um loop for) encontre o último elemento de uma matriz.
Um dos motivos mais comuns pelos quais você acabaria procurando isso é porque deseja passar um array para uma função e não precisa passar outro argumento para seu tamanho. Você também geralmente gostaria que o tamanho da matriz fosse dinâmico. Essa matriz pode conter objetos, não primitivos, e os objetos talvez complexos, de modo que size_of () seja uma opção não segura para calcular a contagem.
Como outros sugeriram, considere o uso de um std :: vector ou lista, etc, em vez de uma matriz primitiva. No entanto, em compiladores antigos, você ainda não teria a solução final que provavelmente deseja, simplesmente porque isso, porque preencher o contêiner requer várias linhas feias de push_back (). Se você é como eu, deseja uma solução de linha única com objetos anônimos envolvidos.
Respostas:
Se você quer dizer uma matriz no estilo C, pode fazer algo como:
Isso não funciona em ponteiros (ou seja , não funciona em nenhum dos seguintes):
ou:
No C ++, se você deseja esse tipo de comportamento, deve estar usando uma classe de contêiner; provavelmente
std::vector
.fonte
Como já foi dito, você pode usar o,
sizeof(arr)/sizeof(*arr)
mas isso fornecerá a resposta errada para os tipos de ponteiro que não são matrizes.Isso tem a boa propriedade de não compilar para tipos que não são de matriz (o visual studio possui o
_countof
que faz isso). Oconstexpr
torna uma expressão de tempo de compilação, para que não tenha desvantagens sobre a macro (pelo menos nenhuma que eu conheça).Você também pode considerar o uso
std::array
do C ++ 11, que expõe seu comprimento sem sobrecarga sobre uma matriz C nativa.O C ++ 17 tem
std::size()
no<iterator>
cabeçalho o mesmo e funciona para contêineres STL (graças a @Jon C ).fonte
T(arg&)[N]
.extent
, olhando para ele agora existem duas características que o tornam menos útil do que a função acima (para este caso de uso). (1) Retorna zero para ponteiros (em vez de um erro de compilação). (2) Ele requer um parâmetro de tipo, portanto, para verificar uma variável que você teria que fazer,decltype
Doing
sizeof( myArray )
você receberá o número total de bytes alocados para essa matriz. Você pode descobrir o número de elementos na matriz dividindo pelo tamanho de um elemento na matriz:sizeof( myArray[0] )
fonte
Embora essa seja uma pergunta antiga, vale a pena atualizar a resposta para C ++ 17. Na biblioteca padrão, agora existe a função de modelo
std::size()
, que retorna o número de elementos em um contêiner std ou em uma matriz no estilo C. Por exemplo:fonte
Sim!
Tentar
sizeof(array)/sizeof(array[0])
Eu não vejo nenhuma maneira para isso, a menos que sua matriz seja uma matriz de caracteres (isto é, string).
PS: Em C ++, use sempre
std::vector
. Existem várias funções embutidas e uma funcionalidade estendida.fonte
std::vector
possui um métodosize()
que retorna o número de elementos no vetor.(Sim, esta é a resposta explícita)
fonte
fonte
Desde o C ++ 11, alguns novos modelos são introduzidos para ajudar a reduzir a dor ao lidar com o comprimento da matriz. Todos eles são definidos no cabeçalho
<type_traits>
.std::rank<T>::value
Se
T
for um tipo de matriz, fornece o valor constante do membro igual ao número de dimensões da matriz. Para qualquer outro tipo, o valor é 0.std::extent<T, N>::value
Se
T
for um tipo de matriz, fornece o valor constante do membro igual ao número de elementos ao longo daN
th dimensão da matriz, seN
estiver em [0,std::rank<T>::value
). Para qualquer outro tipo, ou se aT
matriz de desconhecida estiver ligada ao longo de sua primeira dimensão eN
for 0, o valor será 0.std::remove_extent<T>::type
Se
T
for uma matriz de algum tipoX
, fornece o tipo de membro typedef igual aX
, caso contrário, o tipo éT
. Observe que seT
for uma matriz multidimensional, somente a primeira dimensão será removida.std::remove_all_extents<T>::type
Se
T
for uma matriz multidimensional de algum tipoX
, fornece o tipo de membro typedef igual aX
, caso contrário, o tipo éT
.Para obter o comprimento em qualquer dimensão de uma matriz multidimensional,
decltype
pode ser usado para combinar comstd::extent
. Por exemplo:BTY, para obter o número total de elementos em uma matriz multidimensional:
Ou coloque-o em um modelo de função:
Mais exemplos de como usá-los podem ser encontrados seguindo os links.
fonte
Há também a maneira TR1 / C ++ 11 / C ++ 17 (veja Live on Coliru):
fonte
Em vez de usar a função de matriz incorporada, também conhecida como:
você deve usar a classe de matriz e o modelo de matriz. Tentar:
Portanto, agora, se você deseja encontrar o comprimento da matriz, tudo o que você precisa fazer é usar a função size na classe da matriz.
e isso deve retornar o comprimento dos elementos na matriz.
fonte
Em C ++, usando a classe std :: array para declarar uma matriz, é possível encontrar facilmente o tamanho de uma matriz e também o último elemento.
De fato, a classe array possui muitas outras funções que nos permitem usar um container padrão.
Referência 1 à classe std :: array do C ++
Referência 2 à classe std :: array
Os exemplos nas referências são úteis.
fonte
Essa é uma pergunta praticamente antiga e lendária e já existem muitas respostas incríveis por aí. Porém, com o tempo, novas funcionalidades são adicionadas aos idiomas; portanto, precisamos continuar atualizando as coisas de acordo com os novos recursos disponíveis.
Acabei de notar que alguém ainda não mencionou o C ++ 20. Então, pensei em escrever resposta.
C ++ 20
No C ++ 20, há uma nova maneira melhor adicionada à biblioteca padrão para encontrar o comprimento da matriz, ie
std:ssize()
. Esta função retorna asigned value
.C ++ 17
No C ++ 17, havia uma maneira melhor (naquela época) para a mesma
std::size()
definida emiterator
.PS Esse método também funciona
vector
.Velho
Essa abordagem tradicional já é mencionada em muitas outras respostas.
Apenas para sua informação, se você se pergunta por que essa abordagem não funciona quando o array é passado para outra função . A razão é,
Uma matriz não é passada por valor em C ++, mas o ponteiro para a matriz é passado. Como em alguns casos, passar todas as matrizes pode ser uma operação cara. Você pode testar isso passando a matriz para alguma função e fazendo algumas alterações na matriz lá e, em seguida, imprima a matriz no main novamente. Você obterá resultados atualizados.
E como você já deve saber, a
sizeof()
função fornece o número de bytes; portanto, em outra função, ele retornará o número de bytes alocados para o ponteiro, em vez de toda a matriz. Portanto, essa abordagem não funciona.Mas tenho certeza de que você pode encontrar uma boa maneira de fazer isso, conforme sua exigência.
Feliz codificação.
fonte
Você tem várias opções a serem usadas para obter um tamanho de matriz C.
int myArray [] = {0, 1, 2, 3, 4, 5, 7};
1) sizeof(<array>) / sizeof(<type>):
2) sizeof(<array>) / sizeof(*<array>):
3) sizeof(<array>) / sizeof(<array>[<element>]):
fonte
Aqui está uma implementação
ArraySize
do Google Protobuf .fonte
int nombres[5] = { 9, 3 };
esta função retorna em5
vez de2
.GOOGLE_ARRAYSIZE(new int8_t)
retorna8
no meu ambiente de teste, em vez de gerar erro. A peça fundida parece redundante, sem mencionar a macro C gritante.sizeof(a) / sizeof(*a)
funciona o suficiente como solução legada.Para C ++ / CX (ao escrever, por exemplo, aplicativos UWP usando C ++ no Visual Studio), podemos encontrar o número de valores em uma matriz simplesmente usando a
size()
funçãoCódigo fonte:
Se você
cout
asize_of_array
saída será:fonte
sizeof(array_name)
fornece o tamanho de toda a matriz esizeof(int)
fornece o tamanho do tipo de dados de cada elemento da matriz.Portanto, dividir o tamanho de toda a matriz pelo tamanho de um único elemento da matriz fornece o comprimento da matriz.
fonte
RESPOSTA :
EXPLICAÇÃO :
Como o compilador coloca um pedaço de memória de tamanho específico de lado para cada tipo de dados e uma matriz é simplesmente um grupo desses, você simplesmente divide o tamanho da matriz pelo tamanho do tipo de dados. Se eu tiver uma matriz de 30 strings, meu sistema separará 24 bytes para cada elemento (string) da matriz. Com 30 elementos, isso representa um total de 720 bytes. 720/24 == 30 elementos. O algoritmo pequeno e rígido para isso é:
int number_of_elements = sizeof(array)/sizeof(array[0])
o que equivale anumber_of_elements = 720/24
Observe que você não precisa saber que tipo de dados é a matriz, mesmo que seja um tipo de dados personalizado.
fonte
Apenas um pensamento, mas apenas decidimos criar uma variável de contador e armazenar o tamanho do array na posição [0]. Eu apaguei a maior parte do código que tinha na função, mas você verá que, após sair do loop, prime [0] recebe o valor final de 'a'. Tentei usar vetores, mas o VS Express 2013 não gostou muito disso. Observe também que 'a' começa com um para evitar a substituição [0] e é inicializado no início para evitar erros. Não sou especialista, apenas pensei em compartilhar.
fonte
Uma boa solução que usa genéricos:
Em seguida, basta ligar
arraysize(_Array);
para obter o comprimento da matriz.Fonte
fonte
constexpr
é a correção.inline
não é.constexpr
é bastante moderno. Você tem certeza de que seu programa de teste não está usando outro recurso moderno, onde você pode declarar uma matriz local cujo comprimento é fornecido por uma variável? Experimente com duas matrizes globais.Para o antigo compilador g ++, você pode fazer isso
fonte
Eu forneço uma solução complicada aqui:
Você sempre pode armazenar
length
no primeiro elemento:O custo é que você deve
--arr
quando invocarfree
fonte
arr
é de um tipo compatívelint
e a matriz não excede o valor máximo do tipo. Por exemplo, seqüências de caracteres Pascal são realmente matrizes de bytes usando esse truque; o comprimento máximo de seqüências de caracteres em Pascal é de 255 caracteres.você pode encontrar o comprimento de uma matriz seguindo:
fonte
Simplesmente você pode usar este trecho:
e aqui está a referência: http://www.cplusplus.com/reference/array/array/size/
fonte
Evite usar o tipo junto com sizeof, como
sizeof(array)/sizeof(char)
, de repente, fica corrompido se você alterar o tipo da matriz.No visual studio, você tem o equivalente se
sizeof(array)/sizeof(*array)
. Você pode simplesmente digitar_countof(array)
fonte
Eu, pessoalmente, sugeriria (se você não conseguir trabalhar com funções especializadas por qualquer motivo) expandir primeiro a compatibilidade do tipo de matrizes além do que você usaria normalmente (se estivesse armazenando valores ≥ 0:
do que você tornaria o elemento da matriz 1 maior do que o necessário. Para o último elemento, você colocaria algum tipo incluído no especificador de tipo expandido, mas que normalmente não usaria, por exemplo, usando o exemplo anterior, o último elemento seria -1. Isso permite que você (usando um loop for) encontre o último elemento de uma matriz.
fonte
Um dos motivos mais comuns pelos quais você acabaria procurando isso é porque deseja passar um array para uma função e não precisa passar outro argumento para seu tamanho. Você também geralmente gostaria que o tamanho da matriz fosse dinâmico. Essa matriz pode conter objetos, não primitivos, e os objetos talvez complexos, de modo que size_of () seja uma opção não segura para calcular a contagem.
Como outros sugeriram, considere o uso de um std :: vector ou lista, etc, em vez de uma matriz primitiva. No entanto, em compiladores antigos, você ainda não teria a solução final que provavelmente deseja, simplesmente porque isso, porque preencher o contêiner requer várias linhas feias de push_back (). Se você é como eu, deseja uma solução de linha única com objetos anônimos envolvidos.
Se você optar pela alternativa de contêiner STL para uma matriz primitiva, esta postagem do SO poderá ser útil para você de maneiras de inicializá-la: Qual é a maneira mais fácil de inicializar um std :: vector com elementos codificados?
Aqui está um método que estou usando para isso que funcionará universalmente em compiladores e plataformas:
Crie uma estrutura ou classe como contêiner para sua coleção de objetos. Defina uma função de sobrecarga do operador para <<.
Você pode criar funções que tomam sua estrutura como um parâmetro, por exemplo:
Em seguida, você pode chamar essa função, assim:
Dessa forma, você pode criar e transmitir uma coleção de objetos de tamanho dinâmico para uma função em uma única linha limpa!
fonte
Digamos que você tenha uma matriz global declarada na parte superior da página
Para descobrir quantos elementos existem (em c ++) na matriz, digite o seguinte código:
O tamanho de (NAME_OF_ARRAY) / 4 retornará o número de elementos para o nome da matriz.
fonte