Pergunta

Eu estou tentando para iterar sobre todos os elementos de uma matriz estática de cordas da melhor maneira possível.Eu quero ser capaz de declará-lo em uma linha e facilmente adicionar/remover elementos a partir dele, sem ter que manter o controle do número.Soa muito simples, não é?

A possível 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 - de jeito nenhum para criar o vetor em uma linha com uma lista de cadeias de caracteres

A possível não-solução 2:

string list[] = {"abc", "xyz"};

Problemas - não há maneira de obter o número de cadeias de caracteres automaticamente (que eu conheça).

Deve haver uma maneira fácil de fazer isso.

Foi útil?

Solução

O aumentar atribuir biblioteca parece ser exatamente o que você está procurando.Ele faz a atribuição de constantes para recipientes mais fácil do que nunca.

Outras dicas

C++ 11 adicionado listas de inicialização para permitir a seguinte sintaxe:

std::vector<std::string> v = {"Hello", "World"};

O suporte para este C++ 11 recurso foi adicionado em, pelo menos, O GCC 4.4 e só em O Visual Studio 2013.

Você pode inicializar uma forma concisa vector<string> a partir de uma criados estaticamente char* matriz:

char* strarray[] = {"hey", "sup", "dogg"};
vector<string> strvector(strarray, strarray + 3);

Este cópias de todas as cordas, a propósito, para que você use o dobro da memória.Você pode usar Vai Dean sugestão para substituir o número mágico 3 aqui com arraysize(str_array) -- embora eu me lembre não ser caso especial em que essa versão específica do arraysize pode fazer Algo de Ruim (desculpe, não lembro os detalhes imediatamente).Mas muitas vezes funciona corretamente.

Também, se você estiver realmente entusiasmado sobre a linha coisinha, você pode definir uma aridade variável de macro, de modo que uma única linha como DEFINE_STR_VEC(strvector, "hi", "there", "everyone"); de obras.

Problemas - não há maneira de obter o número de cadeias de caracteres automaticamente (que eu conheça).

Há um bog-forma padrão de fazer isso, que muita gente (incluindo MS) definir macros como arraysize para:

#define arraysize(ar)  (sizeof(ar) / sizeof(ar[0]))

Declarar uma matriz de seqüências de caracteres em C++ como este : char array_of_strings[][]

Por exemplo : char array_of_strings[200][8192];

irá realizar 200 cordas, cada seqüência de ter o tamanho de 8 kb ou 8192 bytes.

utilização strcpy(line[i],tempBuffer); para colocar os dados na matriz de seqüências de caracteres.

Uma possibilidade é usar um ponteiro NULL como um valor de sinalizador:

const char *list[] = {"dog", "cat", NULL};
for (char **iList = list; *iList != NULL; ++iList)
{
    cout << *iList;
}

Você pode usar o begin e end funções de Impulso gama biblioteca para encontrar facilmente as extremidades de uma primitiva matriz, e, ao contrário da solução de macro, isso vai dar um erro de compilação em vez de trincas de comportamento se você acidentalmente aplicá-lo para um ponteiro.

const char* array[] = { "cat", "dog", "horse" };
vector<string> vec(begin(array), end(array));

Você pode usar Vai Dean sugestão [#define arraysize(ar) (sizeof(ar) / sizeof(ar[0]))] para substituir o número mágico 3 aqui com arraysize(str_array) -- embora eu me lembre não ser caso especial em que essa versão específica do arraysize pode fazer Algo de Ruim (desculpe, não lembro os detalhes imediatamente).Mas muitas vezes funciona corretamente.

O caso em que ele não funciona é quando a "matriz" é realmente apenas um ponteiro, não uma matriz real.Além disso, devido à forma como os arrays são passados para funções (convertido para um ponteiro para o primeiro elemento), ele não funciona em chamadas de função, mesmo se a assinatura parece uma matriz some_function(string parameter[]) é realmente some_function(string *parameter).

Fechar vote positivamente Craig H a resposta de que você deve usar o boost::ceder, mas eu não tenho nenhum rep :(

Eu encontrei uma técnica semelhante no primeiro artigo que eu já li por Andrei Alexandrescu em C/C++ Usuários Jornal, Vol 16, Nº 9, setembro de 1998, pp.73-74 (têm a citação completa, porque é nos comentários do meu implementação de seu código venho usando desde então).

Os modelos são o seu amigo.

Aqui está um exemplo:

#include <iostream>
#include <string>
#include <vector>
#include <iterator>

int main() {
    const char* const list[] = {"zip", "zam", "bam"};
    const size_t len = sizeof(list) / sizeof(list[0]);

    for (size_t i = 0; i < len; ++i)
        std::cout << list[i] << "\n";

    const std::vector<string> v(list, list + len);
    std::copy(v.begin(), v.end(), std::ostream_iterator<string>(std::cout, "\n"));
}

Em vez de macro, eu poderia sugerir um presente:

template<typename T, int N>
inline size_t array_size(T(&)[N])
{
    return N;
}

#define ARRAY_SIZE(X)   (sizeof(array_size(X)) ? (sizeof(X) / sizeof((X)[0])) : -1)

1) queremos usar uma macro para torná-lo um tempo de compilação constante;a chamada de função do resultado não é um tempo de compilação constante.

2) no Entanto, nós não queremos usar uma macro porque a macro pode ser acidentalmente usado em um ponteiro.A função pode ser usada somente em tempo de compilação matrizes.

Assim, podemos usar o definido-ness da função para fazer com que a macro "seguro";se a função existir (por exemplo,ele não tamanho zero), em seguida, usamos a macro acima.Se a função não existir nós retornar um valor incorreto.

#include <boost/foreach.hpp>

const char* list[] = {"abc", "xyz"};
BOOST_FOREACH(const char* str, list)
{
    cout << str << endl;
}
#include <iostream>
#include <string>
#include <vector>
#include <boost/assign/list_of.hpp>

int main()
{
    const std::vector< std::string > v = boost::assign::list_of( "abc" )( "xyz" );
    std::copy(
        v.begin(),
        v.end(),
        std::ostream_iterator< std::string >( std::cout, "\n" ) );
}
#include <iostream.h>
#include <iomanip.h>

int main()
{
int n;
cout<<"enter the maximum number\n";
cin>>n;
cout<<"enter the first number\n";
for(int i=0;i<n;i++)
{

for(int j=0;j<n;j++)
{
cin>>a[i][j];
}
}
cout<<"enter the second number\n";
for(int i=0;i<n;i++)
{
for(int k=0;k<n;k++)
{
cin>>b[i][k];
}
}
cout<<"the product will be\n";
for(int i=0;i<n;i++)
{
for(int g=0;g<n;g++)
{
c[i][g]=c[i][c]*c[i][j];
cout<<setw(5)<<c[i][g];
}
cout<<endl;
}
return 0;
}

Diretamente você pode declarar um array de cadeias de caracteres como string s[100];.Então, se você quiser acesso a elementos específicos, você pode obtê-lo diretamente como s[2][90].Para a iteração fins, se o tamanho da seqüência de caracteres usando a s[i].size() função.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top