begin process at 2012 05 29 20:34:39
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Au secours

 > 

Problème avec std::vector et std::pair


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Problème avec std::vector et std::pair

samedi 14 mai 2005 à 18:06:54 | Problème avec std::vector et std::pair

luhtor

J'ai une fonction qui compilait très bien sous linux, mais pas moyen de la compiler avec devCpp. Quelqu'un saurait pourquoi il la refuse ?

template <class _U1, class _V1>
std::ostream & operator << (std::ostream & chaine, std::vector<std::pair< _U1, _V1> > & which)
{
  std::vector< std::pair< _U1, _V1> >::iterator it; // <=== L'erreur est ici:
          // expected `;' before "it"
          // `it' undeclared (first use this function)

  for (it = which.begin() ; it != which.end() ; it++)
    {
      chaine << it->first << " = " << it->second << std::endl;
    }
  return chaine;
}

Il n'y a aucun problème si je déclare ca:
std::vector< std::pair< int, string> >::iterator it;

Donc où est le problème avec les templates et DevCpp ?
samedi 14 mai 2005 à 18:47:34 | Re : Problème avec std::vector et std::pair

vecchio56

Administrateur CodeS-SourceS
Moi ca passe avec VC++ et avec MinGW aussi. Juste des warnings avec MinGW:

C:\>g++ test.cpp
test.cpp: In function `std::ostream& operator<<(std::ostream&,
   std::vector<std::pair<_T1, _T2>, std::allocator<std::pair<_T1, _T2> > >&)':
test.cpp:6: warning: `typename std::vector<std::pair<_T1, _T2>,
   std::allocator<std::pair<_T1, _T2> > >::iterator' is implicitly a typename
test.cpp:6: warning: implicit typename is deprecated, please see the
   documentation for details

Tu vois ce que c'est? iterator n'est pas cencé être un namespace mais bien une classe, non?
Ca ne change rien en remplacant les class par des typename (je connais pas la différence entre les deux donc j'essaie)

samedi 14 mai 2005 à 19:35:41 | Re : Problème avec std::vector et std::pair

steve_clamage

Réponse acceptée !
iterator est un type membre de std::vector, il me semble meme que d'apres la specification de vector faite par le standard on peu penser que c'est un alias de T*.
typename std::vector< std::pair< _U1, _V1> >::iterator it;
c'est juste pour indiquer à ton compilo que c'est un type.
Pour le coup ca devrait meme etre un const_iterator.

samedi 14 mai 2005 à 19:42:19 | Re : Problème avec std::vector et std::pair

vecchio56

Administrateur CodeS-SourceS
Sous VC++ en tous cas j'ai l'impression que c'est une classe (bien que j'ai du mal a lire les sources) qui contient un pointeur
samedi 14 mai 2005 à 20:40:12 | Re : Problème avec std::vector et std::pair

steve_clamage

fais une recherche et positionnes toi au debut de la declaration de la classe vector, puis a partir de la fait une recherche sur iterator, etant donnée que le standard garanti que les données d'un vector sont continues, je suis a peu pres sur que tu dois avoir
template <classe _Tp, ...>
class vector ...
{
    typedef _Tp * iterator; // tout simplement, c'est ce que j'ai avec devcpp
}

tu as quoi exactement ?

ps: j'ai déja lu mon implémentation de std::vector, c'est vrai que c'est rebutant mais en realité ca reste facile à lire par rapport à d'autres classes de la stl et ca permet vraiment de bien comprendre comment fonctionne vector.

samedi 14 mai 2005 à 21:50:56 | Re : Problème avec std::vector et std::pair

vecchio56

Administrateur CodeS-SourceS
Il y a quelques typedef mais pas pour les iterator. Je pensais que c'étaient des classes friend, mais en fait ce sont carrément des classes internes (comme les inner-class en Java, je savais même pas de c'était possible en C++).
Voila a quoi ressemble l'implémentation de VC++ pour vector:


        // TEMPLATE CLASS vector
template<class _Ty,
    class _Ax = allocator<_Ty> >
    class vector
        : public _Vector_val<_Ty, _Ax>
    {    // varying size array of values
public:
    typedef vector<_Ty, _Ax> _Myt;

... // QUELQUES TYPEDEFS

  #define _ITER_BASE(it)    (it)._Myptr
        // CLASS const_iterator
    class const_iterator;
    friend class const_iterator;

    class const_iterator {...}
    class iterator;
    friend class iterator;
    class iterator
        : public const_iterator
        {...}
    typedef std::reverse_iterator<iterator> reverse_iterator;
    typedef std::reverse_iterator<const_iterator> const_reverse_iterator;

... //METHODES DE VECTOR

samedi 14 mai 2005 à 21:53:10 | Re : Problème avec std::vector et std::pair

luhtor

Impeccable merci beaucoup, en effet rajouter typename devant std::vector résoue le problème. Mais j'avoue que j'ai du mal a saisir l'origine de typename. Quand on ouvre stl_vector.h, on trouve la ligne suivante:

typedef __gnu_cxx::__normal_iterator<pointer, vector_type> iterator;

Il faudrait connaitre le fonctionnement de  __normal_iterator. Et ca a l'air de se compliquer.
samedi 14 mai 2005 à 22:51:41 | Re : Problème avec std::vector et std::pair

steve_clamage

__normal_iterator est un adaptateur (adapter) qui permet a priori d'avoir une certaine interface (c'est un design pattern). En standard la stl fourni std::reverse_iterator qui esr un adaptateur permettant de transformer un iterator en reverse_iterator
par exemple
typedef std::reverse_iterator<iterator> reverse_iterator;
ce qui change c'est (entre autre) que l'operateur ++ de reverse_iterator fera la meme chose que l'operateur -- d'iterator par un changement d'interface.

vecchio56, on appel ca des types membres (ou type encapsulé) et c'est tres important en c++ car c'est le seul moyen de programmer proprement, il y en a plein la STL.
typedef  T* iterator;
ca revient au meme de faire
class iterator {};
dans les deux cas iterator est un type membre de vector

si tu fais une classe qui charge une image bmp et que cette classe agrege un objet de type bmp_header, plutot que de faire
class bmp_header
{
};

class bmp
{
    bmp_header _header;
};

il est bien plus raisonnable de faire (car header n'a de raison d'etre que dans bmp)
class bmp
{
    class header
    {
    };
    header _header;
};
dimanche 15 mai 2005 à 01:26:33 | Re : Problème avec std::vector et std::pair

luhtor

Instructif. :)


Cette discussion est classée dans : problème, vector, std, it, which


Répondre à ce message

Sujets en rapport avec ce message

problème avec std::vector [ par loicus ] bonjoursj'ai un problème avec std vector, mon programme plante lorsque je suprimme des éléments du vecteur, et je ne comprend pas pourquoi...j'ai beso Tri des membres d'une classe (std::vector ou std::list) [ par WolfSpirit2a ] Salut à tous ! je suis actuellement en train de programmer un petit jeu sans prétentions en C++/SDLMalheureusement je suis confronté à un problème sur problème sur une création de classe [ par simonpelloquin ] Bonjour, Je bloque sur un problème de définition de classe et ça commence à me prendre la tête. Est-ce que vous pourriez m'indiquer ce qui ne vas pas comment instancier dynamiquement un "vector" [ par mohamed_bn ] Bonjour, J'aime construire une fonction qui retourne un vecteur d'entiers std::vector v; Pour pouvoir récupérer correctement ce tableau, normalement i écriture classe dans un fichier texte [ par nord666 ] Salut tout le monde!J'ai besoin d'aide pour l'écriture dans un fichier. Je voudrais que l'extension du fichier soit .city. Ce que je veux écrire dans exporter des objects STL et BOOST dans un DLL [ par bbking18 ] Bonjours, actuelement je travaille sur une petite biblioteque en c++, j'utilise des containeurs STL ( std::vector et std::set surtout ) et quelques ob Constructeur par parametre [ par pinkettee ] Bonjour, dans mon programme j'ai une erreur quelque part et je sais pas comment la corriger [CODE]class Feuille{ map titrefeuille; [C++, flux et fichier]Charger un fichier dans un vector<char> [ par PhilipMorris ] Bonjour à tous![^^happy10] Débutant en c++, je cherche à charger les octets d'un fichier dans un " vector tableau ", de la taille du fichier donc. J probleme retour tableau [ par lenanttais44 ] Bonjour,Je voudrai savoir si ma facon d'écrire une fonction est bonne.std::vector& fusion(std::vector& Tab1,std::vector& Tab2){   ........return Tfin; Taille max d'arguments pour un std::vector<long> [ par wismerhill__ ] SalutBonjour, dans une fonction j'ai un bug bizar qui apparait lorsque je rempli un std::vecto au 369000 élément.Y'a t'il une taille max d'element à v


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 8,611 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales