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 :

recherche à l'aide d'expression régulière dans des conteneurs


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Baud10
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Mai 2006
    Messages : 66
    Par défaut recherche à l'aide d'expression régulière dans des conteneurs
    Bonjour, voilà j'aimerai effectuer des recherches dans des conteneurs :

    J'ai mon conteneur std::set<char*> qui contient approximativement 23 000 éléments d'environ 150 à 200 char chacun.

    Mais la méthode find(char*) me retourne un itérateur vers l'élément exact trouvé. Or j'aimerai pouvoir appliquer au moins des masque de recherche, voir même des expressions régulières :

    J'ai choisi les ensembles set, car je n'ai pas besoin de clé (donc pas map) et leur architecture en arbre permet des recherche rapide.

    Je cherche donc un moyen de stocker environ 100 000 lignes (peut importe la durée d'initialisation, ces lignes provenants d'un .txt), et de récupérer selon un masque/regEx une liste d'élément correspondant (la recherche devrait être la plus rapide possible, peut importe l'espace mémoire requis)

    Merci de m'aider

  2. #2
    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
    Par défaut
    Regarde du côté de boost.regex
    Avoir un std::set ne te servira à rien par contre, parce qu'il faudra tester tous les éléments...

  3. #3
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    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 296
    Par défaut
    Sans compter qu'un vecteur de char* est déjà un choix pas très heureux. Un set de char* ... n'est pas du tout adapté (à moins de sortir le foncteur qui va bien)
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  4. #4
    Membre confirmé Avatar de Baud10
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Mai 2006
    Messages : 66
    Par défaut
    Explique-moi (je suis débutant) pourquoi set<char*> est un mauvais choix pour stocker plusieurs dizaines de millier de chaînes ?
    Je devrais mieux utiliser set<string> voire... set<AnsiString> (borland power!), peut-être même set<char[255+1]> (s'il accepte?) ?

    Déjà que pour le remplir, je n'ai surement pas été efficasse : un élément du set sont en fait une ligne d'un .txt, étant sous VCL Borland, j'ai créé un TListBox, j'ai utilisé la méthode LoadFromFile, et ensuite un simple for pour ajouter chaque ligne dans le set (ce qui met environ 3 secondes).

  5. #5
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    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 296
    Par défaut
    1- le tri par défaut sera fait sur les pointeurs (operator<(char const*, char const*) compare des pointeurs)
    2- la gestion de la mémoire est manuelle (char*)
    3- un vecteur bien dimensionné sera tout aussi efficace (un set est un arbre trié où l'insertion est en O(ln n))
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  6. #6
    tut
    tut est déconnecté
    Membre éclairé
    Avatar de tut
    Inscrit en
    Juillet 2002
    Messages
    373
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 373
    Par défaut
    Citation Envoyé par Baud10
    Explique-moi (je suis débutant) pourquoi set<char*> est un mauvais choix pour stocker plusieurs dizaines de millier de chaînes ?
    Je devrais mieux utiliser set<string> voire... set<AnsiString> (borland power!), peut-être même set<char[255+1]> (s'il accepte?) ?

    Déjà que pour le remplir, je n'ai surement pas été efficasse : un élément du set sont en fait une ligne d'un .txt, étant sous VCL Borland, j'ai créé un TListBox, j'ai utilisé la méthode LoadFromFile, et ensuite un simple for pour ajouter chaque ligne dans le set (ce qui met environ 3 secondes).
    Effectivement, c'est un peu dommage, parce que tu dois faire plein d'instructions inutiles : ajout des chaînes dans ton composant, puis relecture de ces même chaînes...

    Un coup d'oeil à la FAQ C++, et on trouve :
    Comment faire pour lire un fichier ligne par ligne ?

    Donc si tu utilises la FAQ pour compter le nombre de lignes d'un fichier tu pourras allouer ton vecteur en avance, comme le préconise Luc.

Discussions similaires

  1. Réponses: 3
    Dernier message: 17/04/2011, 11h42
  2. Réponses: 9
    Dernier message: 04/02/2010, 16h36
  3. Utilisation des expressions régulières dans Find/Replace
    Par Kicker dans le forum Code::Blocks
    Réponses: 1
    Dernier message: 22/06/2009, 01h20
  4. Réponses: 0
    Dernier message: 25/02/2008, 14h23
  5. Réponses: 1
    Dernier message: 03/02/2006, 12h35

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