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

value_type vs make_pair

4 réponses
Avatar
David FLEURY
Bonjour,
suite à une discussion sur map::insert et de l'utilisation de
map<>::value_type ou de std::make_pair, j'ai n'ai pas réussi à faire un
exemple ou std::make_pair fonctionnerait alors que value_type ne
fonctionnerait pas (gcc ou VS)

J'avais souvenir d'un problème de conversion implicite (Josuttis en
parle dans The C++ Standard Library 2nd Ed, page 341), constaté à
l'époque sur aCC (hpux), notamment avec les std::string et const char*

Aujourd'hui, je n'arrive pas à retrouver ce problème avec ni gcc 4.8 ni
vs2012.

Du coup, je n'ai pas d'argument technique (vu que je n'arrive pas à le
reproduire) pour préférer std::make_pair...
Il reste, que c'est toujours plus court à taper, et moins à du renommage
sur le typedef par exemple.

Quand est-il au niveau de la norme ?

Voici mon exemple qui fonctionne... (avec le explicit ni la forme
value_type ni la forme make_pair fonctionne)

#include <map>
#include <string>
#include <utility>

using namespace std;

struct MyInt {
/* explicit */ MyInt(int s) : i(s) {}
int i;
};

inline
bool operator<(const MyInt& lhs, const MyInt& rhs) {
return lhs.i < rhs.i;
}

int main() {
typedef map<MyInt, std::string> Ints;
Ints ints;

ints.insert(Ints::value_type(2, "aCString"));
ints.insert(make_pair(2, "aCString"));
}

4 réponses

Avatar
Marc
David FLEURY wrote:

Bonjour,
suite à une discussion sur map::insert et de l'utilisation de
map<>::value_type ou de std::make_pair, j'ai n'ai pas réussi à faire un
exemple ou std::make_pair fonctionnerait alors que value_type ne
fonctionnerait pas (gcc ou VS)



C'est dans l'autre sens que sont les problèmes, make_pair peut
facilement ne pas marcher ou faire des copies inutiles.

Aujourd'hui, je n'arrive pas à retrouver ce problème avec ni gcc 4.8 ni
vs2012.

Du coup, je n'ai pas d'argument technique (vu que je n'arrive pas à le
reproduire) pour préférer std::make_pair...



Je ne pense pas qu'il y en ait de bons. Il y a en revanche des cas
amusants où m[i]=j marche "mieux" que m.insert(value_type(i,j)).

Il reste, que c'est toujours plus court à taper, et moins à du renommage
sur le typedef par exemple.



emplace est encore plus court à taper, insert(make_pair(,)) est à
oublier.
Avatar
David FLEURY
Le 12/06/2013 22:53, Marc a écrit :
David FLEURY wrote:

Bonjour,
suite à une discussion sur map::insert et de l'utilisation de
map<>::value_type ou de std::make_pair, j'ai n'ai pas réussi à faire un
exemple ou std::make_pair fonctionnerait alors que value_type ne
fonctionnerait pas (gcc ou VS)



C'est dans l'autre sens que sont les problèmes, make_pair peut
facilement ne pas marcher



un exemple précis qui ne compilerait pas ?
Je ne me souviens pas en avoir croisé un.

ou faire des copies inutiles.



ça ok


Aujourd'hui, je n'arrive pas à retrouver ce problème avec ni gcc 4.8 ni
vs2012.

Du coup, je n'ai pas d'argument technique (vu que je n'arrive pas à le
reproduire) pour préférer std::make_pair...



Je ne pense pas qu'il y en ait de bons.



Ils seront toujours meilleurs qu'un simple jugement de valeur (c'est
plus beau, c'est plus clair, c'est plus lisible...)

Il y a en revanche des cas
amusants où m[i]=j marche "mieux" que m.insert(value_type(i,j)).




Je ne connais pas. Je fais une utilisation très basique des maps
m[i] = j et insert ne font pas exactement la même chose de toute façon.

Il reste, que c'est toujours plus court à taper, et moins à du renommage
sur le typedef par exemple.



emplace est encore plus court à taper, insert(make_pair(,)) est à
oublier.




Je n'ai pas encore migrer C++11 (utilisation de plusieurs compilo/os)
insert({1,2}) et emplace(1,2)
Oui, c'est 2 touches de moins à taper.
Je comparerais les copie/move pour voir

Merci pour la réponse.
je vais cross-poster sur developpez pour voir.
Avatar
ptyxs
Le 12/06/2013 19:04, David FLEURY a écrit :

Quand est-il au niveau de la norme ?



Tu voulais dire 'Qu'en est-il au niveau de la norme ?' j'imagine ?
Avatar
Olivier Miakinen
Bonjour,

Le 12/07/2013 18:36, ptyxs répondait à David FLEURY :
Le 12/06/2013 19:04, David FLEURY a écrit :

Quand est-il au niveau de la norme ?



Tu voulais dire 'Qu'en est-il au niveau de la norme ?' j'imagine ?



Quitte à pinailler, ce serait plutôt « qu'en est-il dans la norme »,
ou mieux « que dit la norme à ce propos »...

http://fr.wiktionary.org/wiki/au_niveau_de
http://66.46.185.79/bdl/gabarit_bdl.asp?t1=1&id)16

Mais nous sommes hors charte alors je propose un suivi en privé.

--
Olivier Miakinen