value_type vs make_pair
Le
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"));
}
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"));
}
C'est dans l'autre sens que sont les problèmes, make_pair peut
facilement ne pas marcher ou faire des copies inutiles.
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)).
emplace est encore plus court à taper, insert(make_pair(,)) est à
oublier.
un exemple précis qui ne compilerait pas ?
Je ne me souviens pas en avoir croisé un.
ça ok
Ils seront toujours meilleurs qu'un simple jugement de valeur (c'est
plus beau, c'est plus clair, c'est plus lisible...)
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.
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.
Tu voulais dire 'Qu'en est-il au niveau de la norme ?' j'imagine ?
Le 12/07/2013 18:36, ptyxs répondait à David FLEURY :
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