IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

Utilisation de la STL dans le cas d'un tableau de chaine d'int


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 77
    Points : 50
    Points
    50
    Par défaut Utilisation de la STL dans le cas d'un tableau de chaine d'int
    Bonjour,

    Je suis novice en C++, j'aimerais faire quelque chose d'assez simple, créer un équivalent int ** du C dont les dimensions seraient générique, en fonction de ce que l'utilisateur entre en paramètre au programme (./test "width" "height") et ainsi créer une map d'int, dont les contours seraient égales a -1 et le reste a 0.

    J'ai découvert les vector, mais je ne vois pas comment faire quelque chose de dynamique, exemple de code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <vector>
     
    int     main(int ac, char **av)
    {
         std::vector<int[av[1]> map;
         int     cpt = 0;
     
         while (cpt < (av[2] - '0')) // Ca ne fonctionnera pas pour les nombres > a 9 mais c'est juste pour illustrer ma problematique
         {
              map.push_back(??) //comment déclarer en dur quelque chose comme "-1, 0, 0, -1" et faire quelque chose de dynamique nécessitant une itération (pour le nombre de '0' a remplir) ?
              cpt++;
         }
         return 0;
    }
    Merci de m'éclairer

  2. #2
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 426
    Points : 827
    Points
    827
    Par défaut
    Salut,
    Pour voir comment marche la classe vector c'est
    Si non, ça, ça marche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    #include <vector>
     
    using namespace std;
     
    vector<vector<int>* >* MaFonction ( int width, int height )
    {
    	 vector<vector<int>* >* monTableau = new vector<vector<int>* >;
    	 std::vector<int>* maLigne;
    	 for ( int h = 0; h < height; h++ )
    	 {
    		  if ( h == 0 || h == width-1 )
    			   maLigne = new  std::vector<int>( width, -1 );
    		  else
    		  {
    			   maLigne = new  std::vector<int>( width, 0 );
    			   maLigne->at(0) = -1;
    			   maLigne->at(width-1) = -1;
    		  }
    		  monTableau->push_back ( maLigne );
    	 }
    	return monTableau;
    	}
    (Ne pas oublier de détruire monTableau et toutes ses lignes avec 'delete' !)

    Bye.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 77
    Points : 50
    Points
    50
    Par défaut
    Salut,

    Merci beaucoup pour ta réponse et ton code complet

    Je suis déjà passe sur cplusplus.com mais j'arrive pas toujours a trouver ce que je cherche... (Même si je sais qu'on est censé tout y trouver ca ne me suffit malheureusement pas pour comprendre.)

    J'aurais quelques questions a poser concernant ton code, afin de bien comprendre et de pouvoir me débrouiller seul a l'avenir !

    1] Pourquoi créer des pointeurs et des allocations via new ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vector<vector<int>* >* monTableau = new vector<vector<int>* >;
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    std::vector<int>* maLigne;
      maLigne = new  std::vector<int>( width, -1 );
    vue que les vector peuvent être redimensionnés grâce a certaines méthodes comme "push_back()", je ne saisit pas l'intérêt

    2] Dans cette syntaxe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    maLigne = new  std::vector<int>( width, -1 );
    A quoi sert le "width" ? Est-ce facultatif mais une manière de créer un tableau associatif ?

    Merci pour les précisions et désolé pour mon risible niveau !

  4. #4
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 426
    Points : 827
    Points
    827
    Par défaut
    Après réflexion, je trouve que mon code n'est pas génial du tout, il y a plus simple et surement moin bête ( désolé )...

    Mais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    maLigne = new  std::vector<int>( width, -1 );
    ( width, -1 ) initialise un vector de 'width éléments tous initialisés à '-1'

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 77
    Points : 50
    Points
    50
    Par défaut
    1] Dois-je conclure que ta réflexion est une réponse a ma question 1] et que des pointeurs/allocations n'étaient effectivement pas nécessaire ?

    2] Merci beaucoup pour l'explication du "std::vector<int>( width, -1 );" je comprends tout de suite beaucoup mieux

  6. #6
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 426
    Points : 827
    Points
    827
    Par défaut
    Alors, finalement, ça, c'est bien mieux comme code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    #include <iostream>
    #include <vector>
     
    using namespace std;
     
    vector<vector<int> >& MonTableau ( vector<vector<int> > &monTableau, int width, int height )
    {
    	 std::vector<int> maLigne1( width, -1 );//Crée un vector de 'width' éléments à -1
    	 std::vector<int> maLigne2( width, 0);//Crée un vector de 'width' éléments à 0
    	 maLigne2[0] = -1;
    	 maLigne2[width-1] = -1;
     
    	 for ( int h = 0; h < height; h++ )
    	 {
    		  if ( h == 0 || h == height-1 )
    			  monTableau.push_back(maLigne1);
    		  else
    			  monTableau.push_back(maLigne2);
    	 }
    	return monTableau;
    }
     
    void main ()
    {
    	vector< vector<int> > tab;
    	MonTableau ( tab, 4, 3 );
     
    	cout << "Affiche tableau :" << endl;
    	for ( int i = 0; i < 3; i++ )
    	{
    		for ( int j = 0; j < 4; j++ )
    			cout << tab[i][j] << " ";
    		cout << endl;
    	}
     
    	system ("pause");
    }

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 77
    Points : 50
    Points
    50
    Par défaut
    Parfait cette fois je comprends tout du premier coup d'œil !

    Merci encore pour ton aide qui me fait gagner bien du temps et bonne soirée a toi

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 20/01/2013, 21h30
  2. Utilisation de static char * dans un cas precis
    Par student_ dans le forum Débuter
    Réponses: 4
    Dernier message: 09/01/2010, 23h24
  3. est ce que je peux utilise step de rechercher dans mon cas?
    Par helene0618 dans le forum kettle/PDI
    Réponses: 2
    Dernier message: 04/05/2009, 10h42
  4. [Zope] Dans quel cas utiliser zope ?
    Par kalimero dans le forum Zope
    Réponses: 3
    Dernier message: 26/07/2005, 10h08
  5. [corba] débutant : dans quels cas l'utiliser
    Par jmturc dans le forum CORBA
    Réponses: 2
    Dernier message: 10/10/2002, 09h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo