Et que penses-tu de l'écriture :
std::swap(v, vector<T>());
Elle me semble avoir l'avantage de ne favoriser aucun des termes
Et que penses-tu de l'écriture :
std::swap(v, vector<T>());
Elle me semble avoir l'avantage de ne favoriser aucun des termes
Et que penses-tu de l'écriture :
std::swap(v, vector<T>());
Elle me semble avoir l'avantage de ne favoriser aucun des termes
J'aimerais savoir s'il y a une différence entre
vector<C> v;
...
vector<C>().swap (v);
et
vector<C> v;
...
v.swap (vector<C>());
J'aimerais savoir s'il y a une différence entre
vector<C> v;
...
vector<C>().swap (v);
et
vector<C> v;
...
v.swap (vector<C>());
J'aimerais savoir s'il y a une différence entre
vector<C> v;
...
vector<C>().swap (v);
et
vector<C> v;
...
v.swap (vector<C>());
drkm wrote:Mais je trouve tout de même que lorsque l'on a un objet A a
modifier, et un objet B créé pour le modifier, plus clair d'écrire
A.swap( B ) ;
que
B.swap( A ) ;
<Disclaimer>
Je n'ai que survolé la discussion, désolé si je reviens sur un point
déjà mentionné)
</Disclaimer>
Et que penses-tu de l'écriture :
std::swap(v, vector<T>());
drkm wrote:
Mais je trouve tout de même que lorsque l'on a un objet A a
modifier, et un objet B créé pour le modifier, plus clair d'écrire
A.swap( B ) ;
que
B.swap( A ) ;
<Disclaimer>
Je n'ai que survolé la discussion, désolé si je reviens sur un point
déjà mentionné)
</Disclaimer>
Et que penses-tu de l'écriture :
std::swap(v, vector<T>());
drkm wrote:Mais je trouve tout de même que lorsque l'on a un objet A a
modifier, et un objet B créé pour le modifier, plus clair d'écrire
A.swap( B ) ;
que
B.swap( A ) ;
<Disclaimer>
Je n'ai que survolé la discussion, désolé si je reviens sur un point
déjà mentionné)
</Disclaimer>
Et que penses-tu de l'écriture :
std::swap(v, vector<T>());
En fait, s'il s'agissait de la lisibilité : v.clear(). Une fonction
avec un nom comme clear() doit remettre l'objet à l'état qu'il avait
en sortie du constructeur.
Mais le nommage des fonctions n'est pas le point fort de la STL.
Entierement d'accord là !
En fait, s'il s'agissait de la lisibilité : v.clear(). Une fonction
avec un nom comme clear() doit remettre l'objet à l'état qu'il avait
en sortie du constructeur.
Mais le nommage des fonctions n'est pas le point fort de la STL.
Entierement d'accord là !
En fait, s'il s'agissait de la lisibilité : v.clear(). Une fonction
avec un nom comme clear() doit remettre l'objet à l'état qu'il avait
en sortie du constructeur.
Mais le nommage des fonctions n'est pas le point fort de la STL.
Entierement d'accord là !
En fait, s'il s'agissait de la lisibilité : v.clear().
En fait, s'il s'agissait de la lisibilité : v.clear().
En fait, s'il s'agissait de la lisibilité : v.clear().
On 12 Jul 2004 01:45:42 -0700, :En fait, s'il s'agissait de la lisibilité
: v.clear().
Ou éventuellement, "v= std::vector<Machin>()".
On 12 Jul 2004 01:45:42 -0700, kanze@gabi-soft.fr:
En fait, s'il s'agissait de la lisibilité
: v.clear().
Ou éventuellement, "v= std::vector<Machin>()".
On 12 Jul 2004 01:45:42 -0700, :En fait, s'il s'agissait de la lisibilité
: v.clear().
Ou éventuellement, "v= std::vector<Machin>()".
En fait, s'il s'agissait de la lisibilité : v.clear(). Une fonction
avec un nom comme clear() doit remettre l'objet à l'état qu'il avait
en sortie du constructeur.
Je ne suis pas trop d'accord avec toi, là. Pour moi, clear fait bien
ce qu'il dit : il vide le conteneur. Une fonction doit faire ce que
dit son nom, et rien de plus. S'il devait exister uen fonction devant
remettre l'objet tel qu'apres le constructeur, j'imaginerais plutot un
nom comme reset(). (mais ya pas. D'ou le "hack" avec swap)
En fait, s'il s'agissait de la lisibilité : v.clear(). Une fonction
avec un nom comme clear() doit remettre l'objet à l'état qu'il avait
en sortie du constructeur.
Je ne suis pas trop d'accord avec toi, là. Pour moi, clear fait bien
ce qu'il dit : il vide le conteneur. Une fonction doit faire ce que
dit son nom, et rien de plus. S'il devait exister uen fonction devant
remettre l'objet tel qu'apres le constructeur, j'imaginerais plutot un
nom comme reset(). (mais ya pas. D'ou le "hack" avec swap)
En fait, s'il s'agissait de la lisibilité : v.clear(). Une fonction
avec un nom comme clear() doit remettre l'objet à l'état qu'il avait
en sortie du constructeur.
Je ne suis pas trop d'accord avec toi, là. Pour moi, clear fait bien
ce qu'il dit : il vide le conteneur. Une fonction doit faire ce que
dit son nom, et rien de plus. S'il devait exister uen fonction devant
remettre l'objet tel qu'apres le constructeur, j'imaginerais plutot un
nom comme reset(). (mais ya pas. D'ou le "hack" avec swap)
On 12 Jul 2004 01:45:42 -0700, :En fait, s'il s'agissait de la lisibilité : v.clear().
Ou éventuellement, "v= std::vector<Machin>()".
On 12 Jul 2004 01:45:42 -0700, kanze@gabi-soft.fr:
En fait, s'il s'agissait de la lisibilité : v.clear().
Ou éventuellement, "v= std::vector<Machin>()".
On 12 Jul 2004 01:45:42 -0700, :En fait, s'il s'agissait de la lisibilité : v.clear().
Ou éventuellement, "v= std::vector<Machin>()".
Fabien LE LEZ writes:On 12 Jul 2004 01:45:42 -0700, :En fait, s'il s'agissait de la lisibilité
Non. Le sous-fil était parti sur la manière la plus naturelle
d'écrire entre A.swap( B ) et B.swap( A ) pour les définitions de A et
B données plus haut dans le fil, indépendamment du sujet initial de
vider un vecteur.
: v.clear().
Pour vider un vecteur, avec la sémantique du post initial,
std::vector<T>.swap( v ), je trouve cela extrêmement illisible.
Ou éventuellement, "v= std::vector<Machin>()".
Encore une fois, pas pour la sémantique de ton article initial.
~> cat fclcxx.cc
#include <iostream>
#include <vector>
int main()
{
typedef std::vector< int > Vector ;
typedef Vector::size_type Size ;
Vector v1( Size( 10 ) ) ;
Vector v2( Size( 10 ) ) ;
Vector().swap( v1 ) ;
v2 = Vector() ;
std::cout
<< "v1 capacity : "
<< v1.capacity()
<< ", v2 capacity : "
<< v2.capacity()
<< std::endl ;
}
~> g++ -o fclcxx fclcxx.cc -Wall -ansi -pedantic
~> ./fclcxx
v1 capacity : 0, v2 capacity : 10
Je sais que cela ne prouve rien d'autre que ce que fait cette
version de ce compilateur.
Mais pour résumer ce que j'ai compris de cette discussion, ainsi il
me semble que d'un autre fil d'il y a quelques jours (et en y ajoutant
quelques déductions personnelles) :
· la norme ne fournit pas d'autre moyen d'abaisser la capacité
d'un vecteur que par reserve() ;
· cela est incompatible avec la contrainte de complexité constante
de swap() ;
· un DR (le 101, je pense) recommande std::vector<T>().swap( v )
pour vider un vecteur, dans le sens d'abaisser sa capacité à 0 ;
· l'inplémentation que j'imagine triviale de swap() modifie la
capacité, pas celle de operator=().
Pour ces raisons, je pense que la manière la plus sûre de faire [*]
est bien :
std::vector<T>().swap( v ) ;
[*] La seule un peu sûre, bien qu'en contradiction avec la norme,
contradiction aténuée par le fait qu'elle est levée par le DR
101 et que la norme est contradictoire sur ce point.
Fabien LE LEZ <gramster@gramster.com> writes:
On 12 Jul 2004 01:45:42 -0700, kanze@gabi-soft.fr:
En fait, s'il s'agissait de la lisibilité
Non. Le sous-fil était parti sur la manière la plus naturelle
d'écrire entre A.swap( B ) et B.swap( A ) pour les définitions de A et
B données plus haut dans le fil, indépendamment du sujet initial de
vider un vecteur.
: v.clear().
Pour vider un vecteur, avec la sémantique du post initial,
std::vector<T>.swap( v ), je trouve cela extrêmement illisible.
Ou éventuellement, "v= std::vector<Machin>()".
Encore une fois, pas pour la sémantique de ton article initial.
~> cat fclcxx.cc
#include <iostream>
#include <vector>
int main()
{
typedef std::vector< int > Vector ;
typedef Vector::size_type Size ;
Vector v1( Size( 10 ) ) ;
Vector v2( Size( 10 ) ) ;
Vector().swap( v1 ) ;
v2 = Vector() ;
std::cout
<< "v1 capacity : "
<< v1.capacity()
<< ", v2 capacity : "
<< v2.capacity()
<< std::endl ;
}
~> g++ -o fclcxx fclcxx.cc -Wall -ansi -pedantic
~> ./fclcxx
v1 capacity : 0, v2 capacity : 10
Je sais que cela ne prouve rien d'autre que ce que fait cette
version de ce compilateur.
Mais pour résumer ce que j'ai compris de cette discussion, ainsi il
me semble que d'un autre fil d'il y a quelques jours (et en y ajoutant
quelques déductions personnelles) :
· la norme ne fournit pas d'autre moyen d'abaisser la capacité
d'un vecteur que par reserve() ;
· cela est incompatible avec la contrainte de complexité constante
de swap() ;
· un DR (le 101, je pense) recommande std::vector<T>().swap( v )
pour vider un vecteur, dans le sens d'abaisser sa capacité à 0 ;
· l'inplémentation que j'imagine triviale de swap() modifie la
capacité, pas celle de operator=().
Pour ces raisons, je pense que la manière la plus sûre de faire [*]
est bien :
std::vector<T>().swap( v ) ;
[*] La seule un peu sûre, bien qu'en contradiction avec la norme,
contradiction aténuée par le fait qu'elle est levée par le DR
101 et que la norme est contradictoire sur ce point.
Fabien LE LEZ writes:On 12 Jul 2004 01:45:42 -0700, :En fait, s'il s'agissait de la lisibilité
Non. Le sous-fil était parti sur la manière la plus naturelle
d'écrire entre A.swap( B ) et B.swap( A ) pour les définitions de A et
B données plus haut dans le fil, indépendamment du sujet initial de
vider un vecteur.
: v.clear().
Pour vider un vecteur, avec la sémantique du post initial,
std::vector<T>.swap( v ), je trouve cela extrêmement illisible.
Ou éventuellement, "v= std::vector<Machin>()".
Encore une fois, pas pour la sémantique de ton article initial.
~> cat fclcxx.cc
#include <iostream>
#include <vector>
int main()
{
typedef std::vector< int > Vector ;
typedef Vector::size_type Size ;
Vector v1( Size( 10 ) ) ;
Vector v2( Size( 10 ) ) ;
Vector().swap( v1 ) ;
v2 = Vector() ;
std::cout
<< "v1 capacity : "
<< v1.capacity()
<< ", v2 capacity : "
<< v2.capacity()
<< std::endl ;
}
~> g++ -o fclcxx fclcxx.cc -Wall -ansi -pedantic
~> ./fclcxx
v1 capacity : 0, v2 capacity : 10
Je sais que cela ne prouve rien d'autre que ce que fait cette
version de ce compilateur.
Mais pour résumer ce que j'ai compris de cette discussion, ainsi il
me semble que d'un autre fil d'il y a quelques jours (et en y ajoutant
quelques déductions personnelles) :
· la norme ne fournit pas d'autre moyen d'abaisser la capacité
d'un vecteur que par reserve() ;
· cela est incompatible avec la contrainte de complexité constante
de swap() ;
· un DR (le 101, je pense) recommande std::vector<T>().swap( v )
pour vider un vecteur, dans le sens d'abaisser sa capacité à 0 ;
· l'inplémentation que j'imagine triviale de swap() modifie la
capacité, pas celle de operator=().
Pour ces raisons, je pense que la manière la plus sûre de faire [*]
est bien :
std::vector<T>().swap( v ) ;
[*] La seule un peu sûre, bien qu'en contradiction avec la norme,
contradiction aténuée par le fait qu'elle est levée par le DR
101 et que la norme est contradictoire sur ce point.