GNT sans publicité, site mobile, fonctionnalitées exclusives...

2 questions a propos des vecteurs & de leurs initialisations

Le
mderie
Bonjour !

Q1) Je voudrais savoir si on peut demander au compilateur d'inferer le
type d'un element d'un vecteur :

template<class T>
class DumpVisitor
{
public:
void operator()(T item)
{
cout << "Item = " << item << endl;
}
};

vector<int> v;

for_each(v.begin(), v.end(), DumpVisitor<int>); // OK
for_each(v.begin(), v.end(), DumpVisitor<v.?>); // ?

Le but : definir une macro qui ne prend qu'un parametre, le vector !

Q2) Est-ce qu'avec le TR1 on peut ecrire plus simplement ceci :

vector<int> v;
v.push_back(1900);
v.push_back(1984);
v.push_back(2000);
v.push_back(2007);
v.push_back(2008);

Genre : vector<int> v = { 1900, 1984, 2000, 2007, 2008 };

Un tout grand merci.
Lire les 12 réponses

Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 3
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Michael DOUBEZ
Le #1204911
Bonjour !

Q1) Je voudrais savoir si on peut demander au compilateur d'inferer le
type d'un element d'un vecteur :

template<class T>
class DumpVisitor
{
public:
void operator()(T item)
{
cout << "Item = " << item << endl;
}
};

vector<int> v;
...
for_each(v.begin(), v.end(), DumpVisitor<int>); // OK
for_each(v.begin(), v.end(), DumpVisitor
Le but : definir une macro qui ne prend qu'un parametre, le vector !


Le define vector<>::value_type to donne le type des données que
contients le vecteur.


Q2) Est-ce qu'avec le TR1 on peut ecrire plus simplement ceci :

vector<int> v;
v.push_back(1900);
v.push_back(1984);
v.push_back(2000);
v.push_back(2007);
v.push_back(2008);

Genre : vector<int> v = { 1900, 1984, 2000, 2007, 2008 };


Non mais tu peux le faire avec boost::array (std::tr1::array
boost::array<int,5> v_init = { { 1900,1984, 2000, 2007,2008 } };
vector
Sinon, il n'est pas trop du de se faire une fonction make_vector<>() qui
prends un tableau en entrée et retourne le vector<> correspondant puis
tu swap.

Michael

mderie
Le #1205337
On Mar 4, 12:38 pm, Michael DOUBEZ



Bonjour !

Q1) Je voudrais savoir si on peut demander au compilateur d'inferer le
type d'un element d'un vecteur :

template<class T>
class DumpVisitor
{
public:
void operator()(T item)
{
cout << "Item = " << item << endl;
}
};

vector<int> v;
...
for_each(v.begin(), v.end(), DumpVisitor<int>); // OK
for_each(v.begin(), v.end(), DumpVisitor
Le but : definir une macro qui ne prend qu'un parametre, le vector !


Le define vector<>::value_type to donne le type des données que
contients le vecteur.


Oui mais bon cela m'oblige a ecrire qqch de ridicule :

for_each(v.begin(), v.end(), DumpVisitor<vector<int>::value_type>());

Or v a ete entierement defini...
==> Ma conclusion est donc que non le compilo ne peut pas m'aider:-(

Q2) Est-ce qu'avec le TR1 on peut ecrire plus simplement ceci :

vector<int> v;
v.push_back(1900);
v.push_back(1984);
v.push_back(2000);
v.push_back(2007);
v.push_back(2008);

Genre : vector<int> v = { 1900, 1984, 2000, 2007, 2008 };


Non mais tu peux le faire avec boost::array (std::tr1::array
boost::array<int,5> v_init = { { 1900,1984, 2000, 2007,2008 } };


Non merci : Je dois encore compter moi-meme le nombre d'element du
tableau(ici 5)...

Merci bcp quand meme

vector
Sinon, il n'est pas trop du de se faire une fonction make_vector<>() qui
prends un tableau en entrée et retourne le vector<> correspondant puis
tu swap.

Michael



Michel Decima
Le #1206654
On Mar 4, 12:38 pm, Michael DOUBEZ
Q2) Est-ce qu'avec le TR1 on peut ecrire plus simplement ceci :
vector<int> v;
v.push_back(1900);
v.push_back(1984);
v.push_back(2000);
v.push_back(2007);
v.push_back(2008);
Genre : vector<int> v = { 1900, 1984, 2000, 2007, 2008 };
Non mais tu peux le faire avec boost::array (std::tr1::array


boost::array<int,5> v_init = { { 1900,1984, 2000, 2007,2008 } };


Non merci : Je dois encore compter moi-meme le nombre d'element du
tableau(ici 5)...


Sans le TR1, ni Boost, juste avec 2 fonctions triviales (cf plus bas),
il n'y a pas besoin de compter les elements:

int v_init[] = { 1900, 1984, 2000, 2007, 2008 };
vector< int > v( begin(v_init), end(v_init) ) ;

Les deux fonctions begin et end :

template< typename T, size_t N >
inline T* begin( T (&array)[ N ] )
{ return array ; }

template< typename T, size_t N >
inline T* end( T (&array)[ N ] )
{ return array + N ; }



David Côme
Le #1206653
On Tue, 04 Mar 2008 12:38:39 +0100, Michael DOUBEZ

Genre : vector<int> v = { 1900, 1984, 2000, 2007, 2008 };



Ce genre de chose est faite pour boost::assign.
Exemple.
vector<int> v m= 1900, 1984, 2000, 2007, 2008;

James Kanze
Le #1207078
On Mar 4, 5:37 pm, David Côme
On Tue, 04 Mar 2008 12:38:39 +0100, Michael DOUBEZ

Genre : vector<int> v = { 1900, 1984, 2000, 2007, 2008 };


Ce genre de chose est faite pour boost::assign.
Exemple.
vector<int> v m= 1900, 1984, 2000, 2007, 2008;


Il n'y a quelque chose là qui ne va pas. C'est quoi comme
syntax ? Au moins qu'il y ait un macro que je ne vois pas, un
compilateur doit émettre une erreur sur cette ligne. « v m »,
je ne crois pas que sans macro, ça peut jamais être légal. (Je
crois qu'il y a quelque chose dans boost qui permet :
v += 1900, 1984, 2000, 2007, 2008 ;
mais ça marche parce que l'opérateur += est surchargé, et qu'il
renvoie quelque chose pour lequel l'opérateur , est surchargé.
L'obfuscation, quoi. Mais dans ton cas, il n'y a pas
d'opérateurs à surcharger.)

--
James Kanze (GABI Software) email:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


Suivre les réponses
Poster une réponse
Anonyme