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 :

Les vecteurs et les opérateurs en C++ VS la bib. STL


Sujet :

C++

  1. #1
    Membre averti
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mars 2010
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2010
    Messages : 51
    Par défaut Les vecteurs et les opérateurs en C++ VS la bib. STL
    Bonjour,

    J'aimerais faire une comparaison entre deux vecteurs de classe A et je cherche à utiliser des fonctions prédéfinies pour gagner du temps. J'ai cherché dans la FAQ et sur le net et je me suis tombé sur le site de microsoft :
    http://msdn.microsoft.com/en-us/libr...8VS.71%29.aspx

    La méthode utilisée est intéressante, mais je veux bien utiliser une fonction prédéfinie de la bibliothèque STL par exemple.

    Aviez vous une idée? ou dois je créer moi même un opérateur comme celui dans l'exemple précédent?


    Merci d'avance.

  2. #2
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Je comprends pas la question, tu pointes vers une page donnant un exemple d'utilisation d'une fonction de la SL.

  3. #3
    Membre expérimenté Avatar de Nogane
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    241
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 241
    Par défaut
    Bonjour,
    Je ne crois pas que cet opérateur(== sur des vector) existe dans la STL, mais il est facile a faire. Sinon, il y as bien la fonction std::equal:
    template <class InputIterator1, class InputIterator2>
    bool equal ( InputIterator1 first1, InputIterator1 last1,
    InputIterator2 first2 );
    Elle est juste plus lourde syntaxiquement.

  4. #4
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Nogane Voir le message
    Je ne crois pas que cet opérateur(== sur des vector) existe dans la STL,
    Il existe. De meme qu'operator!=, operator<, operator<=, operator>= operator>=.

  5. #5
    Membre averti
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mars 2010
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2010
    Messages : 51
    Par défaut
    Rebonjour,

    Je reformule la question, y'a pas une autre solution, meilleure que celle citée permettant de faire une comparaison entre deux vecteurs d'objets (même si la comparaison se fait selon l'ordre lexicographique et que dans mon cas les vecteurs contiennent des objets non triés, mais bon je vais me débrouiller...).

    Merci pour vos réponses.

  6. #6
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Salut,

    Il n'y a rien à faire, il n'est possible de comparer deux contenants qu'en... comparant leur contenu...

    Comment voudrais tu faire autrement ?

    Maintenant, il est différentes possibilités pour s'assurer que la comparaison entre deux objets soit "cohérente", et donc que la comparaison de deux conteneurs soit, elle aussi cohérente en fonction des objets qu'ils contiennent
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  7. #7
    Membre averti
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mars 2010
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2010
    Messages : 51
    Par défaut
    Merci koala01, maintenant espérons que C++ soit gentil avec mes 200 000 vecteurs et le nombre de comparaisons engendré (soit une complexité de l'ordre de 200 000 au carée )...

    Encore merci pour vos réponses.

  8. #8
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    C'est pour cela que la comparaison de conteneur s'effectue normalement sur des éléments triés, de manière à ce qu'elle puisse "se contenter" d'une comparaison dont la complexité est maximum de N
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  9. #9
    Membre averti
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mars 2010
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2010
    Messages : 51
    Par défaut
    Absolument koala01, mais dans mon cas il n'est pas question de trier les éléments, déjà je cherche encore des optimisations dans mon programme...

  10. #10
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Selon tes données et leur disparité, peut-être peux-tu te contenter d'un hash sur ton vecteur et tester l'inégalité (modulo collision) entre les 2 hashs pour en déduire qu'ils sont différents.

  11. #11
    Membre averti
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mars 2010
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2010
    Messages : 51
    Par défaut
    @3DArchi: mais quelle très bonne idée!
    merci beaucoup, je vais essayer de faire ça

    Merci encore!

  12. #12
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Attention, j'ai l'impression qu'il y a confusion entre deux notions distinctes :
    - Comparer si des vecteurs sont égaux (mêmes éléments, dans le même ordre) : C'est ce que fait l'opérateur ==, en O(N)
    - Comparer si des vecteurs contiennent les mêmes éléments, sans considération d'ordre : C'est ce que fait is_permutation pour des compilateurs récents. Sa complexité est en O(N²) dans le cas pire.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  13. #13
    Membre averti
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mars 2010
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2010
    Messages : 51
    Par défaut
    @JolyLoic : C'est la deuxième notion.
    -"Comparer si des vecteurs contiennent les mêmes éléments, sans considération d'ordre" (et si on pourrait savoir si les éléments de l'un sont inclus dans l'autre ou pas ça sera génial).
    Vous avez une idée?

    J'ai cherché sur le net la fonction "is_permutation" j'ai pas trouvé des choses intéressantes.

    Merci.

  14. #14
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Doubs (Franche Comté)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut
    is_permutation n'est pas encore sur tout les compilo (section 25.2.12 de la norme sinon).

    Mais si tes élément appartiennent à un ensemble ordonné (strictement), copier puis trier les deux conteneurs et les comparer sera plus efficase il me semble (quasi-linéaire contre quadratique pour is_permuation)

  15. #15
    Membre averti
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mars 2010
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2010
    Messages : 51
    Par défaut
    Mes éléments n'appartiennent pas à un ensemble ordonné. En fait ce que je cherche à trouver c'est de savoir si un vecteur de string est inclus dans un autre vecteur de string ou pas (ou mm égal), c'est tout, sachant que les éléments string du vecteur ne sont pas ordonnée.

  16. #16
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Doubs (Franche Comté)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut
    (L'ensemble des chaines de caractères est ordonné, donc si tes éléments appartiennent à un ensemble ordonné)

    Si tu ne te préoccupe pas des doublons tu peus utiliser un tri, unique puis set_difference, ca te donnera une complexité quasi-linéaire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    bool is_include(std::vector<std::string> v1, std::vector<std::string> v2)
    {
    	sort(v1.begin(), v1.end());
    	sort(v2.begin(), v2.end());
    	std::vector<std::string>::const_iterator i1 = unique(v1.begin(), v1.end());
    	std::vector<std::string>::const_iterator i2 = unique(v2.begin(), v2.end());
    	std::vector<std::string> r;
    	return ( set_difference(v1.cbegin(), i1, v2.cbegin(), i2, r.begin()) == r.cbegin() );
    }
    Et après tu peus faire mieux en prenant en entrée des ranges et en jouant avec la classe de trait des itérateurs.

  17. #17
    Membre averti
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mars 2010
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2010
    Messages : 51
    Par défaut
    Juste la dernière instruction, j'ai compris comment ça se fait?

  18. #18
    Membre averti
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mars 2010
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2010
    Messages : 51
    Par défaut
    ReBonjour,

    Je me suis trouvé dans l'obligation de trier les éléments du vecteur, j'ai pas trouvé une autre alternative. J'ai désormais deux vecteurs de string triés.
    Cependant j'ai pas trouvé un algorithme ou une méthode efficace dans la bibliothèque STL répondant à mon besoin :

    => Fusionner les deux vecteurs si le nombre d'éléments en commun dépasse un nombre donnée.
    Donc j'ai besoin de :
    -Trouver le nombre d'éléments en commun
    -L'indice du premier élément en commun dans le 1er vecteur
    -L'indice du premier élément en commun dans le 2e vecteur
    -Fusionner les deux vecteurs.

    Merci d'avance.

  19. #19
    Membre averti
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mars 2010
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2010
    Messages : 51
    Par défaut
    Pour la fusion j'ai trouvé la fonction set_union :
    http://www.cplusplus.com/reference/algorithm/set_union/
    Je vais l'adapter pour les vecteurs de string...

  20. #20
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Doubs (Franche Comté)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut
    Tu as essayé de comprendre le code que j'ai donné en utilisant une doc de la bibliothèque standard ? (ou la norme ?)

    Il y a trois étaqpes :
    - Je trie les deux tableaux
    - J'enlève les doublons dans chaques tableaux
    - J'effectue la différence entre le premier est le second, ie je fait un nouveau tableaux dans lequel il n'y aura que les chaines de charactère du premier tableaux qui ne sont pas dans le second

    Si ce nouveau tableau est vide alors le premier est inclu dans le second (démonstration mathématique assez rapide).

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 01/10/2010, 17h50
  2. Réponses: 23
    Dernier message: 30/10/2008, 15h39
  3. travailler avec les images et les vecteurs
    Par susimido dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 24/04/2006, 15h02

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