2
votes

Implémenter un tableau de chaînes avec des éléments de taille variable

Comment implémenter un tableau de chaînes de tailles différentes, c'est-à-dire un tableau stringar [4] = {"black", "red", "blue", "green"} . Aussi, comment accéder aux lettres / caractères individuels de chaque élément en C ++? Éditer: C'est ce que j'ai essayé dans le CPP. Mais cela donne la même sortie (c'est-à-dire 0) pour toutes les entrées. code:

#include <bits/stdc++.h>
using namespace std;
int main()
{   int n,i,j,p,q,f=0,count=0,key,m;
    char s[100][100];
    cin>>n;
    for( i = 0; i < n; i++)
      for (j = 0; j < 100; j++)
        cin >> s[i][j];
      for(i=0;i<n;i++)
        {
            for (j = 0; j < 100; j++) 
            {
                key = s[i][j];
                for (p = i + 1; p < n; p++) 
                {
                    for (q = 0; q < m; q++) 
                    {
                        if (key == s[p][q]) {f = 1;break;}
                        else {f = 0;continue;}
                    }
                }
                if (f == 1)
                    count++;
            }
        }
    cout<<count;        
    return 0;
}


4 commentaires

L'utilisation de std::vector compte-t-elle comme "l'implémentation" pour vous?


Si votre question reçoit une réponse, veuillez la marquer comme «répondu», PGreen_xyz.


Je suis en fait nouveau dans l'utilisation de stackoverflow. Alors, comment le marquer comme répondu? @Trantor


Naviguez vers la réponse particulière que vous considérez comme résolue le mieux votre problème, sur le côté gauche se trouvent les «flèches» Haut / Bas et le compteur. Ci-dessous, il y a un crochet que vous pouvez définir et désactiver pour marquer "la" réponse.


3 Réponses :


1
votes

Essayez ceci:

std::vector<std::string> VectorOfStrings;
VectorOfStrings.push_back( "blue" );
VectorOfStrings.push_back( "red" );

char letter = VectorOfStrings[ 1 ][ 0 ]; // access 'r'


0 commentaires

1
votes

Vous pouvez accéder aux chaînes et aux caractères individuels de plusieurs manières. Voici trois exemples:

#include <iostream>
#include <vector>

int main() {
    // dynamic array-like collection of strings:
    std::vector<std::string> stringar = {"black","red","blue","green"};

    // access using index
    for(size_t vidx = 0; vidx<stringar.size(); ++vidx) {
        std::cout << "Accessing the contents of " << stringar[vidx] << "\n";
        for(size_t sidx = 0; sidx<stringar[vidx].size(); ++sidx) {
            std::cout << " " << stringar[vidx][sidx] << "\n";
        }
    }

    // access using iterators
    for(std::vector<std::string>::iterator vit = stringar.begin(); vit!=stringar.end(); ++vit) {
        std::cout << "Accessing the contents of " << *vit << "\n";
        for(std::string::iterator sit = (*vit).begin(); sit!=(*vit).end(); ++sit) {
            std::cout << " " << *sit << "\n";
        }
    }

    // access using range based for loop
    for(const auto& str : stringar) {
        std::cout << "Accessing the contents of " << str << "\n";
        for(auto ch : str) {
            std::cout << " " << ch << "\n";
        }
    }
}


0 commentaires

2
votes

En fin de compte, vous devez imaginer cela comme une matrice avec des tailles variables.

[b[b .[l .[a.,.,.,.,.,.,.,.,.,.,.) p>

[b] [l] [u] [e]

[g] [r] [e] [n]

int rows = 4; //black, red, blue, green ==> 4 elements
    int cols[4] = { 5, 3, 4, 5 }; // 5 letters for black, 3 letters for red, etc.
    int** matrix = new int*[rows];
    for (int i = 0; i < rows; ++i)
        matrix[i] = new int[cols[i]];

    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols[i];j++) {
            matrix[i][j] = 0;
            printf("%d", matrix[i][j]);
        }
        printf("\n");
    }

letter aura la lettre en position 1 du tableau dans la matrice de position 0:

Tableau en position 0: noir . lettre en position 1: l final

Tableau en position 1: rouge . Lettre en position 2: d final

[b[l.

[redral[e[e[d.

Modifier:^

Comme vous me l'avez demandé dans les commentaires, ici c'est une implémentation approximative, donc vous pouvez voir comment c'est fait! (excusez mon printf au lieu de cout mais je n'ai pas pu l'utiliser.

 std::vector<std::string> stringar;
    stringar.push_back( "black" );
    stringar.push_back( "red" );

    char letter = stringar[ 0 ][ 1 ]; 
    char letter2 = stringar[ 1 ][ 2 ];

Cela affichera cette sortie , c'est ce que vous recherchez (au lieu de 0 s, quels que soient les minéraux dont vous avez besoin).

00000 (noir) 000 (rouge) 0000 (bleu) 00000 (vert)

 La sortie:


11 commentaires

C'était vraiment utile. En fait, la question que je résolvais est la suivante: un minéral est appelé une pierre précieuse s'il se produit au moins une fois dans chacune des roches de la collection de tableaux. Étant donné une liste de minéraux incrustés dans chacune des roches de John, affichez le nombre de types de pierres précieuses qu'il a dans sa collection. Par exemple, le tableau de chaînes de composition minérale arr = [abc, abc, bc] Les minéraux b et c apparaissent dans chaque composite, il y a donc 02 pierres précieuses.


Alors, pouvez-vous mieux comprendre l'approche à adopter pour résoudre ce problème?


n'y aurait-il pas 3 pierres précieuses et pas 2? comme abc, abc et bc, tous les trois ont b et c, non? Alors posons la question: un minéral peut être appelé, par exemple "abc", ET c'est une pierre précieuse si elle contient, X dedans, par exemple, a, ou b, ou c dans ce cas, n'est-ce pas? @PGreen_xyz


Oui, je suis vraiment désolé de ne pas avoir pu publier la question complète en raison de la limite. Ainsi, chaque élément du tableau (abc, abc, a) définit la composition d'une roche. Ici, a, b, c sont individuellement différents minéraux dans la roche. Puisque b et c sont les seuls minéraux présents dans chaque roche, b et c sont des pierres précieuses. Il y a donc deux pierres précieuses (b et c).


Rappelez-vous, c'est une «matrice» (enfin, c'est et ce n'est pas, mais pour mieux la comprendre, c'est). Donc pour accéder aux membres, une double boucle serait la chose (première boucle pour chaque mot, deuxième boucle pour chaque caractère du mot). ATTENTION , le problème ici est la longueur de la deuxième boucle, car elle varie. Vous pouvez changer cela à la fin de la 1ère boucle, une fois que chaque itération de la seconde a été effectuée! J'essaierai de le mettre en œuvre demain, mais essayez-le par vous-même aujourd'hui! @PGreen_xyz


Comment puis-je ajouter mon code à ce commentaire, car il dépasse la limite de mots?


Je suppose que l'édition de la question est la chose à faire @PGreen_xyz. Ajoutez: "Edit:" et le code ci-dessous!


J'ai ajouté le code dans la question. Pouvez-vous vérifier et suggérer l'erreur?


J'ai ajouté le code dans la question. Pouvez-vous vérifier et suggérer l'erreur?


J'ai modifié ma réponse il y a 5 minutes, vérifiez l'implémentation @PGreen_xyz


Cette quadruple boucle for complique probablement les choses. Essayez le débogage, car il vous montrera CHAQUE étape et valeur de variable que vous devez connaître, pour savoir ce qui se passe. @PGreen_xyz