Estou tentando iterar todos os elementos de uma matriz estática de strings da melhor maneira possível. Quero ser capaz de declará-lo em uma linha e adicionar / remover elementos facilmente sem ter que controlar o número. Parece muito simples, não é?
Possíveis não soluções:
vector<string> v;
v.push_back("abc");
b.push_back("xyz");
for(int i = 0; i < v.size(); i++)
cout << v[i] << endl;
Problemas - nenhuma maneira de criar o vetor em uma linha com uma lista de strings
Possível não solução 2:
string list[] = {"abc", "xyz"};
Problemas - nenhuma maneira de obter o número de strings automaticamente (que eu saiba).
Deve haver uma maneira fácil de fazer isso.
Respostas:
C ++ 11 adicionou listas de inicialização para permitir a seguinte sintaxe:
O suporte para este recurso C ++ 11 foi adicionado pelo menos no GCC 4.4 e apenas no Visual Studio 2013 .
fonte
Você pode inicializar concisamente a
vector<string>
partir de umachar*
matriz criada estaticamente :Isso copia todas as strings, aliás, então você usa o dobro da memória. Você pode usar a sugestão de Will Dean para substituir o número mágico 3 aqui por arraysize (str_array) - embora eu me lembre de haver algum caso especial em que essa versão específica de arraysize pode fazer algo ruim (desculpe, não consigo me lembrar dos detalhes imediatamente) . Mas muitas vezes funciona corretamente.
Além disso, se você estiver realmente entusiasmado com a coisa de uma linha, pode definir uma macro variável para que uma única linha
DEFINE_STR_VEC(strvector, "hi", "there", "everyone");
funcione.fonte
strarray
está em um cabeçalho, não violará a regra de definição única?Existe uma maneira padrão bog de fazer isso, que muitas pessoas (incluindo MS) definem macros como
arraysize
para:fonte
template<typename T, size_t N> inline size_t arraysize(T (&ar)[N]) { return N; }
(Palavra-chave inline não é necessária, mas usada para documentar a intenção da função. Um compilador moderno deveria teoricamente ser capaz de retornar a função inteira, eu acredito.Declare uma matriz de strings em C ++ como esta:
char array_of_strings[][]
Por exemplo :
char array_of_strings[200][8192];
irá conter 200 strings, cada string tendo o tamanho de 8kb ou 8192 bytes.
use
strcpy(line[i],tempBuffer);
para colocar dados no array de strings.fonte
array_of_strings
está em um cabeçalho, não violará a regra de definição única?Uma possibilidade é usar um ponteiro NULL como um valor de sinalizador:
fonte
char*
. Na memória, isso é apresentado como 3 ponteiros - um aponta para "cachorro", outro aponta para "gato" e o outro é NULL. Posso pegar um ponteiro para aquele primeiro ponteiro e obter umchar**
- um ponteiro para um ponteiro para char. Quando eu incremento isso, eu movo o char ** para apontar para o próximo item na lista - um ponteiro para o ponteiro que aponta para "gato", então eu incremento novamente e obtenho um ponteiro que aponta para o ponteiro NULL, e Eu sei que estou feito. (Você pode usar as funções
begin
eend
da biblioteca de intervalo Boost para encontrar facilmente as extremidades de um array primitivo e, ao contrário da solução de macro, isso dará um erro de compilação em vez de um comportamento interrompido se você acidentalmente aplicá-lo a um ponteiro.fonte
O caso em que não funciona é quando o "array" é realmente apenas um ponteiro, não um array real. Além disso, devido à maneira como os arrays são passados para funções (convertidos em um ponteiro para o primeiro elemento), ele não funciona em chamadas de função, mesmo que a assinatura se pareça com um array -
some_function(string parameter[])
realmente ésome_function(string *parameter)
.fonte
Aqui está um exemplo:
fonte
Em vez dessa macro, posso sugerir este:
1) Queremos usar uma macro para torná-la uma constante de tempo de compilação; o resultado da chamada de função não é uma constante de tempo de compilação.
2) No entanto, não queremos usar uma macro porque a macro pode ser usada acidentalmente em um ponteiro. A função só pode ser usada em matrizes de tempo de compilação.
Portanto, usamos a definição da função para tornar a macro "segura"; se a função existe (ou seja, tem tamanho diferente de zero), então usamos a macro como acima. Se a função não existir, retornamos um valor incorreto.
fonte
fonte
fonte
Você pode declarar diretamente um array de strings como
string s[100];
. Então, se você deseja acessar elementos específicos, pode obtê-lo diretamente comos[2][90]
. Para fins de iteração, pegue o tamanho da string usando as[i].size()
função.fonte