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 :

meilleur moyen pour parcourir un tableau


Sujet :

C++

  1. #1
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut meilleur moyen pour parcourir un tableau
    Je voudrais remplir/parcourir/repérer et selection des valeurs un tableau, d'une taille 20000*100 (au maximum),
    Je sais que le meilleur moyen est d'utiliser un vector.
    Mais quel est le moyen le plus rapide pour passer d'un élément a un autre?
    Faut il utiliser les pointeurs... ?
    Merci

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Un pointeur, ou un itérateur (qui est assimilable à un pointeur).

  3. #3
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut
    Ok, c'est ce que je pensais.

    Quand je fais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int main(){
     
         vector<double > tableaux;
        tableaux[3]=3;
    }
    Ca plante. J'imagine que c'est parce que; j'ai pas spécifié la taille du tableaux,
    j'ai pas rentré 3avec un itérateur.

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Points : 1 174
    Points
    1 174
    Par défaut
    Ca plante. J'imagine que c'est parce que; j'ai pas spécifié la taille du tableaux
    tu n'as pas besoin avec un vector.

    Pour ajouter une donnée:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    tableau.push_back( 3 );
    j'ai pas rentré 3avec un itérateur.
    l'itérateur sert à parcourir ton tableau, pas à le remplir.

    Je te conseille de chercher de la documentation sur ce que tu utilises, essayer au hasard n'est pas vraiment la bonne méthode

  5. #5
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut
    ok
    merci, c'est ce que j'ai fait:
    voici le code:
    Merci de le corriger, afin de l'optimiser,(meme si je pense pas qu'il y ait vraiment besoin de l'optimiser vu la taille)
    Est-ce la manière la plus rapide de remplir?

    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
     
    using namespace std;
    int main(){
         double i,j;
          vector<double > lignes ;
     
          vector<vector<double> > tableaux ;
     
     for (j=0;j<=100;j++){
      for(i=0;i<=10000;i++){
        lignes.push_back(i);
      }
       tableaux.push_back(lignes);
     }
    }

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 577
    Points : 256
    Points
    256
    Par défaut
    ben teste le comme ça, et compare en faisant un remplissage par accés direct avec [].

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 98
    Points : 44
    Points
    44
    Par défaut
    Salut, C'est une méthode correcte que tu utilise !

    Maintenant si ton objectif est une optimisation à tout prix comme je voix que tu connais tes valeur max pour i et j tu pourrais vraiment te passer des vecteurs ou si tu aime ça quand même tu pourrais déclarer leur taille à la déclaration car push_back n'est pas forcément la plus rapide des méthodes de cette classe.

    Et ensuite pour le remplir ben par exemple en le parcourant avec iterateurs !!!

    Voila bon courage ++
    Seb

  8. #8
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut
    "pourrais vraiment te passer des vecteurs ou si tu aime ça quand même tu pourrais déclarer"

    On m'a dit que les vecteurs étaient les plus rapides.

    Qu'est ce que tu proposes de mieux pour aller plus vite?

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 98
    Points : 44
    Points
    44
    Par défaut
    En fait la question utile est la suivante : ton tableau a-t-il une taille fixe ou flexible ( durant l'exécution ) si taille flexible => vector sinon tableau classique tout simplement ......

    ++
    Seb

  10. #10
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut
    la taille ne varie pas. On sait quelle sera la taille du tableau avant d'entrer dans la fonction qui manipule le tableau.
    Donc si je t'écoute, je prends un tableau normale.

  11. #11
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 279
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 279
    Points : 11 015
    Points
    11 015
    Par défaut
    Tableau "normal", cela ne veux rien dire.

    Vu la taille, tu oublies les tableaux statiques.
    Il faut donc passer à des solutions dynamiques.
    Tu as le couple new[]/delete[] que je déconseille tant que l'on n'a pas compris comment fonctionne les exceptions. Qui plus est, si tu veux pouvoir être redimensionné, c'est la cata.

    Viennent après les vecteurs qui peuvent avoir des coûts de 0-initialisation (avec resize()) ou pas (avec reserve(), mais là on paie un test lors des push_back).

    Ceci dit, avec ta structure rectangulaire, je m'orienterai plutôt vers des conteneurs et autres solutions spécialisées -> boost.multi_array (pour les objets quelconque), boost.uBlas (pour les matrices et autres vecteurs mathématiques), Blitz++, ATLAS, ...

    J'avais pondu ça il y a quelques temps -> http://www.developpez.net/forums/sho...8&page=1&pp=15

  12. #12
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut
    Ouais, mais s'il faut utiliser la technologie Boost, (que je ne connais pas) ca devient tres complexe. Mais je veux bien regader.
    merci

  13. #13
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Réserve la mémoire quand même avant peut-être.
    Ou alors détermine directement la taille, mais ça initialisera tout à 0.

  14. #14
    Membre actif
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 577
    Points : 256
    Points
    256
    Par défaut
    Citation Envoyé par loufoque
    Ou alors détermine directement la taille, mais ça initialisera tout à 0.
    Oui et dérrière tu fais tes affectations avec l'operateur [] et compare les perf par rapport aux push_back

  15. #15
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut
    je suis en train d'installer Boost. Ca prend pas mal de temps.
    Je vais faire comme a dit Luc, a savoir l'utilisation de matrice.
    Je ne comprend pas ce que dit olive_le_malin quand il parle de [].

  16. #16
    Membre actif
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 577
    Points : 256
    Points
    256
    Par défaut
    salut,
    Regarde là :
    http://c.developpez.com/faq/cpp/?page=STL#STL_vector

    C'est l'opérateur [] :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    lignes.resize(10000);
    tableaux.resize(100);
    for (j=0;j<=100;j++){
      for(i=0;i<=10000;i++){
        lignes[i] = i;
      }
       tableaux[j]=lignes;
     }
    Je sais pas si c'est + rapide ...

  17. #17
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut
    j'ai réussi a installé Boost.
    Comme je l'ai déja dit, je dois remplir un tableau de 10000 par 100, au minimum. Le nombre de lignes et de colonnes sont connus dès le début.
    Comme le dit Luc, le moyenle plus rapide est donc bien l'utilisation de boost boost.uBlas pour les matrices ?

  18. #18
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 279
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 279
    Points : 11 015
    Points
    11 015
    Par défaut
    Disons qu'elle devient intéressante si tu profites des fonctions fournies avec -- si tu manques de perf, il y a moyen de la combiner avec d'autres libs de ce que j'a lu.

    Autrement, pour l'accès avec des [][], ce devrait être comme avec les autres techniques.

  19. #19
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut
    j'ai essayé deux méthodes:
    Celle-ci:

    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 <boost/numeric/ublas/matrix.hpp>
    #include <boost/numeric/ublas/io.hpp>
    using namespace std;
    using namespace boost::numeric::ublas;
    int main () {
     
        matrix<double> m (10000, 200);
        for (unsigned i = 0; i < m.size1 (); ++ i)
            for (unsigned j = 0; j < m.size2 (); ++ j)
                m (i, j) = 3 * i + j;
     
     
    }
    Ca fonctionne très bien, très rapide pour 10000*200.

    J'ai comparé avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    using namespace std;
    int main(){
     
     
         double A[10000][100];
        int i,j,k;
     
      for(j=0;j<10000;j++){
         for(i=0;i<100;i++){
             A[j][i]=3 * i + j;
       }
      }
    c'est meme pas la pein d'essayé, ca plante. Je pense pas que mon code ait une erreur. C'est que 10000 est trop gros. Dépassement de mémoire.

    La question est:
    Peux-tu m'expliquer pq Boost est bcp plus puissant?

  20. #20
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Ton second code plante parce que tu fais une allocation de très grande taille sur la pile qui n'est pas suffisamment grande.
    Je me demande d'ailleurs si des compilateurs intelligents pourraient pas détecter ça et éventuellement adapter la taille de la pile en conséquence...

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Meilleur moyen pour savoir s'il éxiste une relation
    Par Cydonia dans le forum VBA Access
    Réponses: 4
    Dernier message: 03/07/2008, 09h34
  2. probléme pour parcourir un tableau dans une JSP
    Par nightcyborg dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 02/12/2007, 17h28
  3. Réponses: 15
    Dernier message: 02/10/2007, 08h25
  4. Réponses: 2
    Dernier message: 17/10/2006, 11h25
  5. Meilleure Méthode pour parcourir un tableau
    Par KPitN dans le forum MFC
    Réponses: 7
    Dernier message: 24/02/2005, 16h19

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