Dúvida Simples, array de Strings C++ [RESOLVIDO]

1. Dúvida Simples, array de Strings C++ [RESOLVIDO]

Nick Us
Nick-us

(usa Slackware)

Enviado em 09/07/2020 - 20:15h

Busquei solução na Internet e não achei devido a nomes parecidos (vetor, vector, array, lista, matriz, dinamico), sem nenhum resultado lógico, então não sei se é possível fazer!

OBS a pergunta não se relaciona a std::vector ou std::arrays pq ainda nem estudei std::arrays.

Imagine o array simples de strings, abaixo com 3 espaços!
Logo abaixo replico List1 em List2 vazia! OBS se minha idéia do sizeof está errada por favor me avisem, o objetivo do sizeof é pegar o valor 3 e até então funciona!
std::string List1[] = {"abc", "def", "ghi"}; // array com 3 Strings
std::string List2[(sizeof(List1) / sizeof(std::string))]; // array vazio com espaço para 3 Strings

MAS não quero List2[3], quero List2[], dinâmico, mas não sei declará-lo dinâmico, inicialmente vazio.
De forma que permita depois adicionar os espaços que eu precisar, resultando: List2[1] ou List2[10]

É possível ter o array simples acima dinâmico?
A idéia surgiu porque com vectors isso é possível, graças a grande aula que o Paulo aqui do VOL me deu, AMEI vectors!

Pensei! Pq usar vector se posso usar um simples array para o que preciso?
Imagino que um vector seja mais pesado que um array simples, tenha desempenho menor, ou algo do tipo. Se meu pensamento vector x array simples é ridículo, gostaria de saber! Pois tudo o que quero é economizar recursos!


  


2. MELHOR RESPOSTA

Paulo
paulo1205

(usa Ubuntu)

Enviado em 09/07/2020 - 21:53h

Nick-us escreveu:

Busquei solução na Internet e não achei devido a nomes parecidos (vetor, vector, array, lista, matriz, dinamico), sem nenhum resultado lógico, então não sei se é possível fazer!

OBS a pergunta não se relaciona a std::vector ou std::arrays pq ainda nem estudei std::arrays.

Imagine o array simples de strings, abaixo com 3 espaços!
Logo abaixo replico List1 em List2 vazia! OBS se minha idéia do sizeof está errada por favor me avisem, o objetivo do sizeof é pegar o valor 3 e até então funciona!
std::string List1[] = {"abc", "def", "ghi"}; // array com 3 Strings
std::string List2[(sizeof(List1) / sizeof(std::string))]; // array vazio com espaço para 3 Strings


Eu acho sempre bom evitar amarrar o nome do tipo se você puder. E no caso acima você pode.
std::string List2[sizeof List1 / sizeof list1[0]]; 


E outra coisa: esse array não será vazio, como você colocou no seu comentário, pois nunca existem arrays vazios em C ou C++. Por sua natureza fixa, arrays nativos são amarrados em memória desde o início de sua vida (o momento da declaração) até o final dela (seja o final do bloco ou o do programa). Você pode até não conhecer ou não estar interessado nos valores iniciais, mas o número de elementos nunca muda, e todos eles têm alguma coisa guardada.

No seu caso, List2 é um array com três elementos. Como o tipo std::string possui um construtor default (i.e. que não recebe argumentos) que cria uma string vazia, tal construtor é invocado para cada elemento no momento em que a declaração é processada. Você terá, portanto, um array com três elementos, e cada um desses elementos será uma string vazia.

NOTA: std::string usa alocação dinâmica para armazenar a string que você eventualmente colocar em cada objeto criado. Quando você declara um array de std::strings, você só vai reservar espaço na memória para guardar os campos de controle da classe std::string (que certamente incluem um ponteiro para a região que vier a ser dinamicamente alocada para conter os dados da string). Assim sendo, os três arrays abaixo vão produzir o mesmo valor se você aplicar sizeof sobre cada um deles, embora sejam completamente diferentes os valores de resposta da chamada de std::string::length() em cada um dos seus elementos.
std::string
a1[3],
a2[3]={"abc", "def", "ghi"},
a3[3]={"Todo o texto da Bíblia", "Todo o texto da Encyclopaedia Britannica", "Todos os textos da Internet concatenados"}
;


MAS não quero List2[3], quero List2[], dinâmico, mas não sei declará-lo dinâmico, inicialmente vazio.
De forma que permita depois adicionar os espaços que eu precisar, resultando: List2[1] ou List2[10]


O que você quer, então, é std::vector. Não existe nada parecido com isso usando arrays nativos em C++.

NOTA: Em C, existe desde o padrão de 1999 uma espécie array de tamanho variável (variable-length array, ou VLA), mas o “tamanho variável” significa apenas que o valor usado no momento da declaração pode vir de uma variável, não que o tamanho vai poder ser mudado após a declaração, além de outras restrições que o tornam menos atraente do que no princípio poderia parecer. VLAs no estilo do C nunca foram adotados em C++, e tudo faz crer que nunca serão. O próprio C, aliás, tornou VLAs uma parte opcional da implementação da linguagem desde o padrão de 2011, o que torna o recurso ainda menos atrativo.

É possível ter o array simples acima dinâmico?


Não como array nativo. Use std::vector.

A idéia surgiu porque com vectors isso é possível, graças a grande aula que o Paulo aqui do VOL me deu, AMEI vectors!

Pensei! Pq usar vector se posso usar um simples array para o que preciso?
Imagino que um vector seja mais pesado que um array simples, tenha desempenho menor, ou algo do tipo. Se meu pensamento vector x array simples é ridículo, gostaria de saber! Pois tudo o que quero é economizar recursos!


O custo adicional, em tempo de execução, de usar std::vector, comparado a arraus nativos, tende a ser baixo; quase zero — a não ser que você fique o tempo todo provocando realocações ou inserções e remoções de elementos em posições que não ao final do vetor. Se você considerar que operações de alteração inclusão e remoção e realocações nem sequer existem em arrays nativos, a comparação nem ao menos faz muito sentido.

Você pode reduzir a quantidade de realocações se você tiver uma ideia do tamanho que o vetor pode vir a ter, mesmo que o crie inicialmente vazio.
std::vector<int> vi;  // vi.size()==0;  vi.capacity()==0
vi.push_back(1); // Realocação: vi.size()==1; vi.capacity()==1
vi.push_back(2); // Outra realocação: vi.size()==2; vi.capacity()==2
vi.reserve(100); // Realocação programada: vi.size()==2; vi.capacity()==100
for(int i=0; i<100; i++)
vi.push_back(i); // As primeiras 98 iterações não vão causar realocação, pois vi.size() será <= vi.capacity(). As duas últimas, vão causá-la.



... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)

3. Re: Dúvida Simples, array de Strings C++ [RESOLVIDO]

Nick Us
Nick-us

(usa Slackware)

Enviado em 09/07/2020 - 23:40h

paulo1205 escreveu:
E outra coisa: esse array não será vazio, como você colocou no seu comentário, pois nunca existem arrays vazios em C ou C++. Por sua natureza fixa, arrays nativos são amarrados em memória desde o início de sua vida (o momento da declaração) até o final dela (seja o final do bloco ou o do programa). Você pode até não conhecer ou não estar interessado nos valores iniciais, mas o número de elementos nunca muda, e todos eles têm alguma coisa guardada.

Bom saber!

NOTA: std::string usa alocação dinâmica para armazenar a string que você eventualmente colocar em cada objeto criado. Quando você declara um array de std::strings, você só vai reservar espaço na memória para guardar os campos de controle da classe std::string (que certamente incluem um ponteiro para a região que vier a ser dinamicamente alocada para conter os dados da string). Assim sendo, os três arrays abaixo vão produzir o mesmo valor se você aplicar sizeof sobre cada um deles, embora sejam completamente diferentes os valores de resposta da chamada de std::string::length() em cada um dos seus elementos.

Um Detalhe que eu havia esqueçido, mas que usarei no futuro para entender melhor o tamanho deles! Eu havia esquecido que poderia comparar os tamanhos do que uso com o sizeof!

Não existe nada parecido com isso usando arrays nativos em C++.

Bom saber, eu queria mesmo ter certeza, pq havia ficado na dúvida!

O custo adicional, em tempo de execução, de usar std::vector, comparado a arraus nativos, tende a ser baixo; quase zero — a não ser que você fique o tempo todo provocando realocações ou inserções e remoções de elementos em posições que não ao final do vetor. Se você considerar que operações de alteração inclusão e remoção e realocações nem sequer existem em arrays nativos, a comparação nem ao menos faz muito sentido.

Gostei de saber, e eu aqui me preocupando a toa! O meu uso normal é como vc descreve, ele é mais estático do que modificado! 99% do tempo será fixo! E os outros 1% é quando....... houver necessidade de adicionar ou ainda mais raramente remover..... alguma coisa!

Mais uma vez obrigado!








Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts