Question

J'essaie de parcourir tous les éléments d'un tableau statique de chaînes de la meilleure façon possible.Je veux pouvoir le déclarer sur une seule ligne et y ajouter/supprimer facilement des éléments sans avoir à garder une trace du numéro.Cela semble vraiment simple, n'est-ce pas ?

Non-solutions possibles :

vector<string> v;
v.push_back("abc");
b.push_back("xyz");

for(int i = 0; i < v.size(); i++)
    cout << v[i] << endl;

Problèmes - aucun moyen de créer le vecteur sur une seule ligne avec une liste de chaînes

Non-solution possible 2 :

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

Problèmes - aucun moyen d'obtenir automatiquement le nombre de chaînes (à ma connaissance).

Il doit y avoir un moyen simple de procéder.

Était-ce utile?

La solution

Le booster la bibliothèque d'attribution semble être exactement ce que vous recherchez.Cela rend l’attribution de constantes aux conteneurs plus facile que jamais.

Autres conseils

C++ 11 a ajouté des listes d'initialisation pour autoriser la syntaxe suivante :

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

La prise en charge de cette fonctionnalité C++ 11 a été ajoutée au moins CCG 4.4 et seulement dans Visual Studio 2013.

Vous pouvez initialiser de manière concise un vector<string> à partir d'un créé statiquement char* tableau:

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

En passant, cela copie toutes les chaînes, vous utilisez donc deux fois la mémoire.Vous pouvez utiliser la suggestion de Will Dean pour remplacer le nombre magique 3 ici par arraysize(str_array) -- même si je me souviens qu'il y a eu un cas particulier dans lequel cette version particulière de arraysize pourrait faire quelque chose de mal (désolé, je ne me souviens pas immédiatement des détails) .Mais cela fonctionne très souvent correctement.

De plus, si vous êtes vraiment enthousiaste à propos du truc à une ligne, vous pouvez définir une macro variadique afin qu'une seule ligne telle que DEFINE_STR_VEC(strvector, "hi", "there", "everyone"); travaux.

Problèmes - aucun moyen d'obtenir automatiquement le nombre de chaînes (à ma connaissance).

Il existe une manière standard de procéder pour cela, que de nombreuses personnes (y compris MS) définissent des macros comme arraysize pour:

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

Déclarez un tableau de chaînes en C++ comme ceci : char array_of_strings[][]

Par exemple : char array_of_strings[200][8192];

contiendra 200 chaînes, chaque chaîne ayant une taille de 8 Ko ou 8192 octets.

utiliser strcpy(line[i],tempBuffer); pour mettre les données dans le tableau de chaînes.

Une possibilité consiste à utiliser un pointeur NULL comme valeur d'indicateur :

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

Vous pouvez utiliser le begin et end fonctions de la bibliothèque de plage Boost pour trouver facilement les extrémités d'un tableau primitif, et contrairement à la solution macro, cela donnera une erreur de compilation au lieu d'un comportement interrompu si vous l'appliquez accidentellement à un pointeur.

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

Vous pouvez utiliser la suggestion de Will Dean [#define arraysize(ar) (sizeof(ar) / sizeof(ar[0]))] pour remplacer le nombre magique 3 ici par arraysize(str_array) -- même si je me souviens qu'il y a eu un cas particulier dans lequel cette version particulière de arraysize pourrait faire quelque chose de mal (désolé, je ne me souviens pas immédiatement des détails).Mais cela fonctionne très souvent correctement.

Le cas où cela ne fonctionne pas est lorsque le "tableau" n'est en réalité qu'un pointeur, pas un véritable tableau.De plus, en raison de la manière dont les tableaux sont transmis aux fonctions (convertis en pointeur vers le premier élément), cela ne fonctionne pas avec les appels de fonction même si la signature ressemble à un tableau - some_function(string parameter[]) est vraiment some_function(string *parameter).

J'ai essayé de voter pour la réponse de Craig H selon laquelle vous devriez utiliser boost::assign, mais je n'ai pas de représentant :(

J'ai rencontré une technique similaire dans le premier article que j'ai lu d'Andrei Alexandrescu dans Journal des utilisateurs C/C++, Vol 16, No 9, septembre 1998, p.73-74 (avoir la citation complète car c'est dans les commentaires de mon implémentation de son code que j'utilise depuis).

Les modèles sont vos amis.

Voici un exemple :

#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"));
}

Au lieu de cette macro, puis-je suggérer celle-ci :

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) Nous voulons utiliser une macro pour en faire une constante à la compilation ;le résultat de l'appel de fonction n'est pas une constante de compilation.

2) Cependant, nous ne souhaitons pas utiliser de macro car la macro pourrait être accidentellement utilisée sur un pointeur.La fonction ne peut être utilisée que sur des tableaux au moment de la compilation.

Ainsi, nous utilisons le caractère défini de la fonction pour rendre la macro « sûre » ;si la fonction existe (c'est-à-direil a une taille non nulle) alors nous utilisons la macro comme ci-dessus.Si la fonction n'existe pas nous renvoyons une mauvaise valeur.

#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;
}

Vous pouvez déclarer directement un tableau de chaînes comme string s[100];.Ensuite si vous souhaitez accéder à des éléments spécifiques, vous pouvez l'obtenir directement comme s[2][90].À des fins d'itération, prenez la taille de la chaîne en utilisant les[i].size() fonction.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top