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

SL & STL C++ Discussion :

complexité des opérations sur les vector


Sujet :

SL & STL C++

  1. #1
    Membre actif
    Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    219
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2007
    Messages : 219
    Points : 226
    Points
    226
    Par défaut complexité des opérations sur les vector
    Bonjour,

    Je me pose des questions au sujet de la complexité des opérations sur les vector.

    En voici quelques unes :

    • complexité de size()
    • complexité de capacity()
    • lors de la reallocation, quelle est la nouvelle taille ? le double de la capacité actuelle, la capacité actuelle +1 ?
    • l'opérateur [] est-il beaucoup plus rapide que at() ?


    Merci de m'éclairer !

  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 : 39
    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
    complexité de size()
    O(1), c'est stocké.

    complexité de capacity()
    O(1), c'est stocké.

    lors de la reallocation, quelle est la nouvelle taille ? le double de la capacité actuelle, la capacité actuelle +1 ?
    C'est la taille courante multipliée par un facteur supérieur à 1 (probalement 1.5 ou 2 -- je pense que chaque implémentation est libre de choisir) ; bref ce n'est pas +1, donc la complexité amortie d'un push_back est bien en O(1).

    l'opérateur [] est-il beaucoup plus rapide que at() ?
    La fonction at() ne fait que tester si l'index est entre 0 et size() - 1.

  3. #3
    Membre actif
    Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    219
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2007
    Messages : 219
    Points : 226
    Points
    226
    Par défaut
    pour ces réponses très précises.

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2007
    Messages : 53
    Points : 37
    Points
    37
    Par défaut
    Citation Envoyé par Laurent Gomila Voir le message
    La fonction at() ne fait que tester si l'index est entre 0 et size() - 1.
    La fonction at(x) permet de récuperer la valeur à la position x de ton vector, et surtout, il gère les dépassements... Si ton vector a une taille de 10 et que tu fais monvector.at(23) il va te retourner une erreur aulieu de te retourner n'importe quelle valeur qui traine dans la mémoire...

  5. #5
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par pyknite Voir le message
    La fonction at(x) permet de récuperer la valeur à la position x de ton vector, et surtout, il gère les dépassements... Si ton vector a une taille de 10 et que tu fais monvector.at(23) il va te retourner une erreur aulieu de te retourner n'importe quelle valeur qui traine dans la mémoire...
    Sous visual, l'operateur [] le fait aussi mais tu peut l'enlever (je ne sais plus comment)

  6. #6
    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 : 39
    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
    Citation Envoyé par Mongaulois Voir le message
    Sous visual, l'operateur [] le fait aussi mais tu peut l'enlever (je ne sais plus comment)
    Seulement en debug à mon avis.

  7. #7
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    malheuresement non

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #include <vector>
     
    int main(int argc, char* argv[])
    {
        std::vector<int> vect(10);
        for(int i=0;i<11;++i) vect[i];
    	return 0;
    }
    donne en release
    Microsoft Visual Studio C Runtime Library has detected a fatal error in testvectorr.exe.
    lancé avec visual

    testvectorr.exe has encountered a problem and needs to close. We are sorry for the inconvenience.
    sans visual

  8. #8
    Membre éclairé

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Points : 858
    Points
    858
    Par défaut
    Sous Visual 2008 pour enlever les vérifications en release il faut définir _SECURE_SCL=0.

  9. #9
    Membre actif
    Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    219
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2007
    Messages : 219
    Points : 226
    Points
    226
    Par défaut
    Je travaille avec Visual 2003.

    Si j'ai bien compris, par défaut, l'opérateur [] est identique à la fonction at(), lorsque on lance l'application depuis visual ?

    Mais si on lance l'application hors de visual, alors l'opérateur [] est optimisé ?

  10. #10
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    En fait l'opérateur [] ne vérifie pas si tu dépasses la taille de ton conteneur... (hormis sous vc apperemment...) alors que at() le fait lui. Ce qui fait que at() est un peu plus lent que l'opérateur [].. car il vérifie à chaque fois que tu estbien à l'intérieur du tableau et pas hors limite;
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  11. #11
    Membre actif
    Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    219
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2007
    Messages : 219
    Points : 226
    Points
    226
    Par défaut
    Citation Envoyé par Goten Voir le message
    En fait l'opérateur [] ne vérifie pas si tu dépasses la taille de ton conteneur... (hormis sous vc apperemment...) alors que at() le fait lui. Ce qui fait que at() est un peu plus lent que l'opérateur [].. car il vérifie à chaque fois que tu estbien à l'intérieur du tableau et pas hors limite;
    Oui oui j'avais bien compris les choses comme ça.
    Ce que je me demande, c'est si je compile mon application avec VC++, et que je la lance hors de visual, est-ce que l'opérateur [] fera des vérifications ou pas.

  12. #12
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par pierre.letessier Voir le message
    Oui oui j'avais bien compris les choses comme ça.
    Ce que je me demande, c'est si je compile mon application avec VC++, et que je la lance hors de visual, est-ce que l'opérateur [] fera des vérifications ou pas.
    oui sauf si tu le desactive. Sous 2003, y as forte chance que ce soit quasiment la même chose

  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
    Le comportement de operator[] est indéfini si l'index n'est pas dans le vecteur.
    Terminer le programme avec une erreur ou lancer une exception sont des comportements possibles.
    Néanmoins, terminer le programme est une bien meilleure idée s'il doit s'agir d'une option désactivable. C'est ce que fait libstdc++ en mode debug.
    Boost ftw

  14. #14
    Membre actif
    Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    219
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2007
    Messages : 219
    Points : 226
    Points
    226
    Par défaut
    Rien ne vaut un petit test.

    Executé en dehors de visual. La différence est flagrante. Cela dit il faudrait vraiment être un malade pour faire autant d'accès dans un programme.

    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
     
    #include "stdafx.h"
    #include <vector>
    #include <iostream>
     
    using namespace std;
     
     
    int _tmain(int argc, _TCHAR* argv[])
    {
    	vector<int> myVect(1000);
     
    	for(int i=0; i<10000000; i++)
    	{
    		for(int j=0; j<1000; j++)
    		{
    			//myVect.at(j);	// -> 19 secondes
    			myVect[j];	// -> moins de 1 seconde
    		}
    	}
     
    	return 0;
    }

  15. #15
    Membre éclairé

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Points : 858
    Points
    858
    Par défaut
    Moins de 1 seconde c'est parce que le compilateur a supprimé les deux boucles vu qu'elles ne font rien d'observable. Avec at() non plus elles ne font rien d'ailleurs mais ça le compilo n'est pas encore assez intelligent pour le remarquer.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 06/04/2013, 11h53
  2. [TPW] Calculatrice effectuant des opérations sur les entiers longs
    Par forum dans le forum Codes sources à télécharger
    Réponses: 0
    Dernier message: 04/12/2011, 11h36
  3. Optimisation des opérations sur les grands nombres, algorithme de Knuth
    Par Jackyzgood dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 21/10/2010, 20h27
  4. Des opérations sur les mots
    Par nadia27 dans le forum Débuter
    Réponses: 5
    Dernier message: 05/01/2008, 13h18
  5. [2.0] Comment réaliser des opérations sur les ensembles ?
    Par Cereal123 dans le forum Framework .NET
    Réponses: 2
    Dernier message: 23/10/2006, 13h01

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