Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

std::count_if sur une std::map

8 réponses
Avatar
Stephane Wirtel
Bonjour,

Donc, création d'un nouveau type se basant sur des classes de la STL.

typedef std::map <int, std::pair < bool, std::pair <double, double> > > MapPair;


Je veux employer std::count_if et en lisant la doc, je vois qu'il faut un prédicat unaire.

J'ai défini la fonction IsNotEmpty comme suit :

bool IsNotEmpty (std::pair <bool, std::pair <double, double> > element) {
return element.first = true;
}

Et je l'utilise de la manière suivante :

MapPair mapPair;
int nombre = count_if (mapPair.begin (), mapPair.end (), IsNotEmpty);

Lors de la compilation, g++ me donne une erreur concernant une erreur de transtypage entre un const std::pair <double, double> vers un double.


Est-ce que ma fonction IsNotEmpty est correcte ? Ou se situe mon erreur au niveau de la déclaration de mon prédicat ?

Merci

Stéphane

8 réponses

Avatar
Jean-Marc Bourguet
Stephane Wirtel writes:

Bonjour,

Donc, création d'un nouveau type se basant sur des classes de la STL.

typedef std::map <int, std::pair < bool, std::pair <double, double> > > MapPair;


Je veux employer std::count_if et en lisant la doc, je vois qu'il faut un prédicat unaire.

J'ai défini la fonction IsNotEmpty comme suit :

bool IsNotEmpty (std::pair <bool, std::pair <double, double> > element) {
return element.first = true;
}

Et je l'utilise de la manière suivante :

MapPair mapPair;
int nombre = count_if (mapPair.begin (), mapPair.end (), IsNotEmpty);


La valeur "pointee" par un iterateur sur une map n'est pas du type que
tu penses mais d'une paire cle, valeur stockee (donc dans ton cas
std::pair<int, std::pair < bool, std::pair <double, double> > >)
Ok, il est plus simple d'ecrire MapPair::value_type...

bool IsNotEmpty (MapPair::value_type element) {
return element.second.first;
}

(Au fait tu sais que tu as ecrit une assignation et pas une
comparaison?)

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Avatar
Stephane Wirtel
bool IsNotEmpty (std::pair <bool, std::pair <double, double> > element) {
return element.first = true;
}
Je semble avoir trouvé en allant regarder dans le code de la fonction count_if.


bool IsNotEmpty (std::pair <int, std::pair <bool, std::pair <double, double> > > element) {
return element.second.first = true;
}

Avatar
Stephane Wirtel
Stephane Wirtel writes:


Bonjour,

Donc, création d'un nouveau type se basant sur des classes de la STL.

typedef std::map <int, std::pair < bool, std::pair <double, double> > > MapPair;


Je veux employer std::count_if et en lisant la doc, je vois qu'il faut un prédicat unaire.

J'ai défini la fonction IsNotEmpty comme suit :

bool IsNotEmpty (std::pair <bool, std::pair <double, double> > element) {
return element.first = true;
}

Et je l'utilise de la manière suivante :

MapPair mapPair;
int nombre = count_if (mapPair.begin (), mapPair.end (), IsNotEmpty);



La valeur "pointee" par un iterateur sur une map n'est pas du type que
tu penses mais d'une paire cle, valeur stockee (donc dans ton cas
std::pair<int, std::pair < bool, std::pair <double, double> > >)
Ok, il est plus simple d'ecrire MapPair::value_type...
Effectivement, en lisant le code de la fonction j'ai pû constater, qu'il lui fallait un iterateur,

donc, dans le mail suivant ma question, j'ai corrigé mon tir et cela fonctionne.

Par contre, peux-tu me dire à quoi correspond :: value_type ? s'agit-il d'un iterator ?

bool IsNotEmpty (MapPair::value_type element) {
return element.second.first;
}

(Au fait tu sais que tu as ecrit une assignation et pas une
comparaison?)
Oui, il s'agit d'une faute de ma part lors de la rédaction de ce mail, n'ayant pas fait de copier/coller, j'en suis le fautif.




Merci pour la confirmation dans ma solution.


Avatar
Jean-Marc Bourguet
Stephane Wirtel writes:

Effectivement, en lisant le code de la fonction j'ai pû constater,
qu'il lui fallait un iterateur, donc, dans le mail suivant ma
question, j'ai corrigé mon tir et cela fonctionne.

Par contre, peux-tu me dire à quoi correspond :: value_type ?
s'agit-il d'un iterator ?


Non, du type retourne par l'operateur * sur les iterateurs. C'est le
type reellement stocke quand la map.

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Avatar
Pierre THIERRY
Le Tue, 31 May 2005 13:26:34 +0200, Stephane Wirtel a écrit :
Je semble avoir trouvé en allant regarder dans le code de la fonction
count_if.


Pour la lisibilité, tu pourrais ici utiliser plus de typedef, y compris,
comme déjà dit, ceux déjà définis...

typedef pair<double, double> double2;
typedef pair<bool, double2> Pair;
typedef map<int, Pair> MapPair;

Devoir retaper X fois une aussi longue définition de type, c'est quand
même une bonne façon de se pousser à la faute.

Brièvement,
Nowhere man
--

OpenPGP 0xD9D50D8A

Avatar
Serge Paccalin
Le mardi 31 mai 2005 à 13:26, Stephane Wirtel a écrit dans
fr.comp.lang.c++ :

bool IsNotEmpty (std::pair <bool, std::pair <double, double> > element) {
return element.first = true;
}
Je semble avoir trouvé en allant regarder dans le code de la fonction count_if.


bool IsNotEmpty (std::pair <int, std::pair <bool, std::pair <double, double> > > element) {
return element.second.first = true;
}


C'est normal que tu affectes true à element.second.first ?
Si oui, je n'ai rien dit.

Sinon, pourquoi ne pas mettre la constante à gauche du test == pour
détecter la coquille à la compilation ? Ou même, dans le cas de bool,
pourquoi le comparer à une constante, puisqu'un bool est vrai ou faux en
soi ?

--
___________ 31/05/2005 15:38:30
_/ _ _`_`_`_) Serge PACCALIN -- sp ad mailclub.net
_L_) Il faut donc que les hommes commencent
-'(__) par n'être pas fanatiques pour mériter
_/___(_) la tolérance. -- Voltaire, 1763


Avatar
Stephane Wirtel

Je semble avoir trouvé en allant regarder dans le code de la fonction
count_if.



Pour la lisibilité, tu pourrais ici utiliser plus de typedef, y compris,
comme déjà dit, ceux déjà définis...

typedef pair<double, double> double2;
typedef pair<bool, double2> Pair;
typedef map<int, Pair> MapPair;
Dans le code que j'ai mis à disposition, il ne s'agissait que d'un exemple tiré d'un bout de code que j'ai pondu tout à l'heure.

Le véritable code est bien plus propre que l'exemple montré dans les mails précédents.

Devoir retaper X fois une aussi longue définition de type, c'est quand
même une bonne façon de se pousser à la faute.

Brièvement,
Nowhere man



Avatar
Stephane Wirtel
Le mardi 31 mai 2005 à 13:26, Stephane Wirtel a écrit dans
fr.comp.lang.c++ :


bool IsNotEmpty (std::pair <bool, std::pair <double, double> > element) {
return element.first = true;
}


Je semble avoir trouvé en allant regarder dans le code de la fonction count_if.

bool IsNotEmpty (std::pair <int, std::pair <bool, std::pair <double, double> > > element) {
return element.second.first = true;
}



C'est normal que tu affectes true à element.second.first ?
Oui, en fait,

le std::pair <bool, std::pair <double, double> > correspond à une zone horraire
qui permet de savoir si cette zone est libre ou pas, d'où le bool à true
pour occupée et à false pour libre.
Si oui, je n'ai rien dit.

Sinon, pourquoi ne pas mettre la constante à gauche du test == pour
détecter la coquille à la compilation ? Ou même, dans le cas de bool,
pourquoi le comparer à une constante, puisqu'un bool est vrai ou faux en
soi ?


Erreur à cause d'une habitude que j'ai ;-) la correction fût vite faite ;-)
Merci de la remarque.