Où j'ai un problème,
c'est cette distinction entre « erase » et « remove ». Parce
qu'en fin de compte, list<>::erase() et list<>::remove font
exactement la même chose -- la seule différence, c'est dans leur
manière de choisir l'élément ou les éléments à enlever.
Ils ne font pas *exactement* la même chose, heureusement.
Et cela peut justifier leur différence terminologique : dans
leurs actions, erase et remove ne s'appliquent pas à la même
structure.
De la même manière qu'on efface *le* tableau et qu'on enlève
*quelque chose sur le* tableau, list<>::erase s'applique à la
liste elle-même (ou à une de ses parties), tandis que
list<>::remove s'applique à ses éléments.
list<>::erase a une sémantique orientée ensemble : on invalide
une partie de la liste, en bloc.
list<>::remove a une sémantique orientée élément : on invalide
des éléments déterminés de l'ensemble "liste".
Et évidemment, le fait que std::remove() n'enlève rien.
Parce que les algorithmes n'en ont pas le droit.
Mais l'action est tout de même comparable à celle de
list<>::remove, donc il peut sembler normal d'avoir le même
nom.
Où j'ai un problème,
c'est cette distinction entre « erase » et « remove ». Parce
qu'en fin de compte, list<>::erase() et list<>::remove font
exactement la même chose -- la seule différence, c'est dans leur
manière de choisir l'élément ou les éléments à enlever.
Ils ne font pas *exactement* la même chose, heureusement.
Et cela peut justifier leur différence terminologique : dans
leurs actions, erase et remove ne s'appliquent pas à la même
structure.
De la même manière qu'on efface *le* tableau et qu'on enlève
*quelque chose sur le* tableau, list<>::erase s'applique à la
liste elle-même (ou à une de ses parties), tandis que
list<>::remove s'applique à ses éléments.
list<>::erase a une sémantique orientée ensemble : on invalide
une partie de la liste, en bloc.
list<>::remove a une sémantique orientée élément : on invalide
des éléments déterminés de l'ensemble "liste".
Et évidemment, le fait que std::remove() n'enlève rien.
Parce que les algorithmes n'en ont pas le droit.
Mais l'action est tout de même comparable à celle de
list<>::remove, donc il peut sembler normal d'avoir le même
nom.
Où j'ai un problème,
c'est cette distinction entre « erase » et « remove ». Parce
qu'en fin de compte, list<>::erase() et list<>::remove font
exactement la même chose -- la seule différence, c'est dans leur
manière de choisir l'élément ou les éléments à enlever.
Ils ne font pas *exactement* la même chose, heureusement.
Et cela peut justifier leur différence terminologique : dans
leurs actions, erase et remove ne s'appliquent pas à la même
structure.
De la même manière qu'on efface *le* tableau et qu'on enlève
*quelque chose sur le* tableau, list<>::erase s'applique à la
liste elle-même (ou à une de ses parties), tandis que
list<>::remove s'applique à ses éléments.
list<>::erase a une sémantique orientée ensemble : on invalide
une partie de la liste, en bloc.
list<>::remove a une sémantique orientée élément : on invalide
des éléments déterminés de l'ensemble "liste".
Et évidemment, le fait que std::remove() n'enlève rien.
Parce que les algorithmes n'en ont pas le droit.
Mais l'action est tout de même comparable à celle de
list<>::remove, donc il peut sembler normal d'avoir le même
nom.
Yoxoman wrote:Où j'ai un problème,
c'est cette distinction entre « erase » et « remove ». Parce
qu'en fin de compte, list<>::erase() et list<>::remove font
exactement la même chose -- la seule différence, c'est dans leur
manière de choisir l'élément ou les éléments à enlever.
Ils ne font pas *exactement* la même chose, heureusement.
Et qu'est-ce qu'ils font de différent ? list<>::erase() ôte des
éléments de la liste. list<>::remove() ôte des éléments de la
liste. La seule différence, c'est la manière de désigner les
éléments.
Et cela peut justifier leur différence terminologique : dans
leurs actions, erase et remove ne s'appliquent pas à la même
structure.
Ils s'appliquent tous les deux à list<>. Obligatoire, en fin de
compte, parce qu'elles sont des fonctions membre.
list<>::erase a une sémantique orientée ensemble : on invalide
une partie de la liste, en bloc.
list<>::remove a une sémantique orientée élément : on invalide
des éléments déterminés de l'ensemble "liste".
Toutes les deux ôte des éléments déterminés. Elles ne diffèrent
que dans la façon à désigner les éléments.
Et en passant... elles n'« invalide » pas les éléments ; elles
les ôtent carrément, en les enlevant et en les détruisant.
Mais l'action est tout de même comparable à celle de
list<>::remove, donc il peut sembler normal d'avoir le même
nom.
L'action de déplacer un objet dans une suite est comparable à
l'action de l'ôter de la suite ? Tu m'étonnes de plus en plus.
Yoxoman wrote:
Où j'ai un problème,
c'est cette distinction entre « erase » et « remove ». Parce
qu'en fin de compte, list<>::erase() et list<>::remove font
exactement la même chose -- la seule différence, c'est dans leur
manière de choisir l'élément ou les éléments à enlever.
Ils ne font pas *exactement* la même chose, heureusement.
Et qu'est-ce qu'ils font de différent ? list<>::erase() ôte des
éléments de la liste. list<>::remove() ôte des éléments de la
liste. La seule différence, c'est la manière de désigner les
éléments.
Et cela peut justifier leur différence terminologique : dans
leurs actions, erase et remove ne s'appliquent pas à la même
structure.
Ils s'appliquent tous les deux à list<>. Obligatoire, en fin de
compte, parce qu'elles sont des fonctions membre.
list<>::erase a une sémantique orientée ensemble : on invalide
une partie de la liste, en bloc.
list<>::remove a une sémantique orientée élément : on invalide
des éléments déterminés de l'ensemble "liste".
Toutes les deux ôte des éléments déterminés. Elles ne diffèrent
que dans la façon à désigner les éléments.
Et en passant... elles n'« invalide » pas les éléments ; elles
les ôtent carrément, en les enlevant et en les détruisant.
Mais l'action est tout de même comparable à celle de
list<>::remove, donc il peut sembler normal d'avoir le même
nom.
L'action de déplacer un objet dans une suite est comparable à
l'action de l'ôter de la suite ? Tu m'étonnes de plus en plus.
Yoxoman wrote:Où j'ai un problème,
c'est cette distinction entre « erase » et « remove ». Parce
qu'en fin de compte, list<>::erase() et list<>::remove font
exactement la même chose -- la seule différence, c'est dans leur
manière de choisir l'élément ou les éléments à enlever.
Ils ne font pas *exactement* la même chose, heureusement.
Et qu'est-ce qu'ils font de différent ? list<>::erase() ôte des
éléments de la liste. list<>::remove() ôte des éléments de la
liste. La seule différence, c'est la manière de désigner les
éléments.
Et cela peut justifier leur différence terminologique : dans
leurs actions, erase et remove ne s'appliquent pas à la même
structure.
Ils s'appliquent tous les deux à list<>. Obligatoire, en fin de
compte, parce qu'elles sont des fonctions membre.
list<>::erase a une sémantique orientée ensemble : on invalide
une partie de la liste, en bloc.
list<>::remove a une sémantique orientée élément : on invalide
des éléments déterminés de l'ensemble "liste".
Toutes les deux ôte des éléments déterminés. Elles ne diffèrent
que dans la façon à désigner les éléments.
Et en passant... elles n'« invalide » pas les éléments ; elles
les ôtent carrément, en les enlevant et en les détruisant.
Mais l'action est tout de même comparable à celle de
list<>::remove, donc il peut sembler normal d'avoir le même
nom.
L'action de déplacer un objet dans une suite est comparable à
l'action de l'ôter de la suite ? Tu m'étonnes de plus en plus.
Yoxoman wrote:Où j'ai un problème, c'est cette distinction entre «
erase » et « remove ». Parce qu'en fin de compte,
list<>::erase() et list<>::remove font exactement la
même chose -- la seule différence, c'est dans leur
manière de choisir l'élément ou les éléments à enlever.
Ils ne font pas *exactement* la même chose, heureusement.
Et qu'est-ce qu'ils font de différent ? list<>::erase() ôte
des éléments de la liste. list<>::remove() ôte des éléments
de la liste. La seule différence, c'est la manière de
désigner les éléments.
Nicolas Sarkozy et Olivier Besancenot font exactement la même
chose : de la politique.
Tout dépend du degré de précision que tu donnes à la *chose*.
Pour moi, il y a une différence entre ôter des éléments
déterminés (au sens où *je* détermine), et ôter des éléments
qui correspondent à une partie déterminée de la liste.
Et cela peut justifier leur différence terminologique :
dans leurs actions, erase et remove ne s'appliquent pas à
la même structure.
Ils s'appliquent tous les deux à list<>. Obligatoire, en fin
de compte, parce qu'elles sont des fonctions membre.
J'avais remarqué, merci. Ce que je veux dire, c'est que
list<>::erase s'oriente (sémantiquement) vers la liste
elle-même, tandis que list <>::remove s'oriente
(sémantiquement) vers les éléments de la liste.
Et je trouve que ça correspond bien avec la différence de
niveau auxquels s'appliquent les termes effacer et enlever.
L'action d'effacer quelque chose se base sur ce quelque chose
et s'applique au contenu de ce quelque chose, alors que
l'action d'enlever quelque chose se base sur ce quelque chose
et s'applique à ce quelque chose lui-même.
Ce qui donne :
list<>::erase se base sur une partie de la liste et s'applique
à son contenu (ses éléments, qu'il ôte), alors que
list<>::remove se base sur des éléments déterminés (par moi)
de la liste, et s'applique sur ces éléments eux-mêmes (il les
ôte).
C'est mon point de vue, et j'espère être clair.
Je trouve que ça justifie leur différence terminologique.
C'est tout ce que je voulais dire.
list<>::erase a une sémantique orientée ensemble : on
invalide une partie de la liste, en bloc.
list<>::remove a une sémantique orientée élément : on
invalide des éléments déterminés de l'ensemble "liste".
Toutes les deux ôte des éléments déterminés. Elles ne
diffèrent que dans la façon à désigner les éléments.
Déterminés par qui ?
Dans list<>::erase, je ne détermine pas les éléments à ôter.
Par contre, je détermine la partie de la liste dont je veux
ôter les éléments.
Mais l'action est tout de même comparable à celle de
list<>::remove, donc il peut sembler normal d'avoir le
même nom.
L'action de déplacer un objet dans une suite est comparable
à l'action de l'ôter de la suite ? Tu m'étonnes de plus en
plus.
Si les actions se résument pour toi à *ôter* et *déplacer*,
non.
C'est bien sûr ailleurs qu'elles se comparent.
#include <iostream>
#include <list>
#include <iterator>
int main()
{
std::list<int> l;
typedef std::list<int>::iterator list_iter;
l.push_back(1);
l.push_back(2);
l.push_back(3);
l.push_back(2);
//l.remove(2); (1)
//list_iter it = std::remove(l.begin(), l.end(), 2); (2)
std::copy(l.begin(), l.end(),
std::ostream_iterator<int>(std::cout, " "));
}
avec (1), on obtient 1 3.
avec (2), on obtient 1 3 3 2, it désigne le troisième élément, e t donc
la plage [l.begin(), it), c'est 1 3.
Je trouve ça comparable. Si ça t'étonne, tant pis.
Yoxoman wrote:
Où j'ai un problème, c'est cette distinction entre «
erase » et « remove ». Parce qu'en fin de compte,
list<>::erase() et list<>::remove font exactement la
même chose -- la seule différence, c'est dans leur
manière de choisir l'élément ou les éléments à enlever.
Ils ne font pas *exactement* la même chose, heureusement.
Et qu'est-ce qu'ils font de différent ? list<>::erase() ôte
des éléments de la liste. list<>::remove() ôte des éléments
de la liste. La seule différence, c'est la manière de
désigner les éléments.
Nicolas Sarkozy et Olivier Besancenot font exactement la même
chose : de la politique.
Tout dépend du degré de précision que tu donnes à la *chose*.
Pour moi, il y a une différence entre ôter des éléments
déterminés (au sens où *je* détermine), et ôter des éléments
qui correspondent à une partie déterminée de la liste.
Et cela peut justifier leur différence terminologique :
dans leurs actions, erase et remove ne s'appliquent pas à
la même structure.
Ils s'appliquent tous les deux à list<>. Obligatoire, en fin
de compte, parce qu'elles sont des fonctions membre.
J'avais remarqué, merci. Ce que je veux dire, c'est que
list<>::erase s'oriente (sémantiquement) vers la liste
elle-même, tandis que list <>::remove s'oriente
(sémantiquement) vers les éléments de la liste.
Et je trouve que ça correspond bien avec la différence de
niveau auxquels s'appliquent les termes effacer et enlever.
L'action d'effacer quelque chose se base sur ce quelque chose
et s'applique au contenu de ce quelque chose, alors que
l'action d'enlever quelque chose se base sur ce quelque chose
et s'applique à ce quelque chose lui-même.
Ce qui donne :
list<>::erase se base sur une partie de la liste et s'applique
à son contenu (ses éléments, qu'il ôte), alors que
list<>::remove se base sur des éléments déterminés (par moi)
de la liste, et s'applique sur ces éléments eux-mêmes (il les
ôte).
C'est mon point de vue, et j'espère être clair.
Je trouve que ça justifie leur différence terminologique.
C'est tout ce que je voulais dire.
list<>::erase a une sémantique orientée ensemble : on
invalide une partie de la liste, en bloc.
list<>::remove a une sémantique orientée élément : on
invalide des éléments déterminés de l'ensemble "liste".
Toutes les deux ôte des éléments déterminés. Elles ne
diffèrent que dans la façon à désigner les éléments.
Déterminés par qui ?
Dans list<>::erase, je ne détermine pas les éléments à ôter.
Par contre, je détermine la partie de la liste dont je veux
ôter les éléments.
Mais l'action est tout de même comparable à celle de
list<>::remove, donc il peut sembler normal d'avoir le
même nom.
L'action de déplacer un objet dans une suite est comparable
à l'action de l'ôter de la suite ? Tu m'étonnes de plus en
plus.
Si les actions se résument pour toi à *ôter* et *déplacer*,
non.
C'est bien sûr ailleurs qu'elles se comparent.
#include <iostream>
#include <list>
#include <iterator>
int main()
{
std::list<int> l;
typedef std::list<int>::iterator list_iter;
l.push_back(1);
l.push_back(2);
l.push_back(3);
l.push_back(2);
//l.remove(2); (1)
//list_iter it = std::remove(l.begin(), l.end(), 2); (2)
std::copy(l.begin(), l.end(),
std::ostream_iterator<int>(std::cout, " "));
}
avec (1), on obtient 1 3.
avec (2), on obtient 1 3 3 2, it désigne le troisième élément, e t donc
la plage [l.begin(), it), c'est 1 3.
Je trouve ça comparable. Si ça t'étonne, tant pis.
Yoxoman wrote:Où j'ai un problème, c'est cette distinction entre «
erase » et « remove ». Parce qu'en fin de compte,
list<>::erase() et list<>::remove font exactement la
même chose -- la seule différence, c'est dans leur
manière de choisir l'élément ou les éléments à enlever.
Ils ne font pas *exactement* la même chose, heureusement.
Et qu'est-ce qu'ils font de différent ? list<>::erase() ôte
des éléments de la liste. list<>::remove() ôte des éléments
de la liste. La seule différence, c'est la manière de
désigner les éléments.
Nicolas Sarkozy et Olivier Besancenot font exactement la même
chose : de la politique.
Tout dépend du degré de précision que tu donnes à la *chose*.
Pour moi, il y a une différence entre ôter des éléments
déterminés (au sens où *je* détermine), et ôter des éléments
qui correspondent à une partie déterminée de la liste.
Et cela peut justifier leur différence terminologique :
dans leurs actions, erase et remove ne s'appliquent pas à
la même structure.
Ils s'appliquent tous les deux à list<>. Obligatoire, en fin
de compte, parce qu'elles sont des fonctions membre.
J'avais remarqué, merci. Ce que je veux dire, c'est que
list<>::erase s'oriente (sémantiquement) vers la liste
elle-même, tandis que list <>::remove s'oriente
(sémantiquement) vers les éléments de la liste.
Et je trouve que ça correspond bien avec la différence de
niveau auxquels s'appliquent les termes effacer et enlever.
L'action d'effacer quelque chose se base sur ce quelque chose
et s'applique au contenu de ce quelque chose, alors que
l'action d'enlever quelque chose se base sur ce quelque chose
et s'applique à ce quelque chose lui-même.
Ce qui donne :
list<>::erase se base sur une partie de la liste et s'applique
à son contenu (ses éléments, qu'il ôte), alors que
list<>::remove se base sur des éléments déterminés (par moi)
de la liste, et s'applique sur ces éléments eux-mêmes (il les
ôte).
C'est mon point de vue, et j'espère être clair.
Je trouve que ça justifie leur différence terminologique.
C'est tout ce que je voulais dire.
list<>::erase a une sémantique orientée ensemble : on
invalide une partie de la liste, en bloc.
list<>::remove a une sémantique orientée élément : on
invalide des éléments déterminés de l'ensemble "liste".
Toutes les deux ôte des éléments déterminés. Elles ne
diffèrent que dans la façon à désigner les éléments.
Déterminés par qui ?
Dans list<>::erase, je ne détermine pas les éléments à ôter.
Par contre, je détermine la partie de la liste dont je veux
ôter les éléments.
Mais l'action est tout de même comparable à celle de
list<>::remove, donc il peut sembler normal d'avoir le
même nom.
L'action de déplacer un objet dans une suite est comparable
à l'action de l'ôter de la suite ? Tu m'étonnes de plus en
plus.
Si les actions se résument pour toi à *ôter* et *déplacer*,
non.
C'est bien sûr ailleurs qu'elles se comparent.
#include <iostream>
#include <list>
#include <iterator>
int main()
{
std::list<int> l;
typedef std::list<int>::iterator list_iter;
l.push_back(1);
l.push_back(2);
l.push_back(3);
l.push_back(2);
//l.remove(2); (1)
//list_iter it = std::remove(l.begin(), l.end(), 2); (2)
std::copy(l.begin(), l.end(),
std::ostream_iterator<int>(std::cout, " "));
}
avec (1), on obtient 1 3.
avec (2), on obtient 1 3 3 2, it désigne le troisième élément, e t donc
la plage [l.begin(), it), c'est 1 3.
Je trouve ça comparable. Si ça t'étonne, tant pis.
Tout dépend du degré de précision que tu donnes à la *chose*.
Pour moi, il y a une différence entre ôter des éléments
déterminés (au sens où *je* détermine), et ôter des éléments
qui correspondent à une partie déterminée de la liste.
On ôte des éléments déterminés dans les deux cas.
La seule
différence, c'est dans la manière de les déterminer. Or, au
moins en anglais, les mots « remove » et « erase » n'ont aucun
rapport avec la manière de choisir ce qui est enlevé ou ce qui
est effacé.
(Si on voulait chercher plus loin, on dirait que « remove »
enleve l'élément complétement, tandis qu'« erase » ne fait que
l'effacer, en laissant le support. C-à-d qu'« erase » appelerait
le destructeur, mais ne libèrerait pas la mémoire. Mais il ne
faut pas exagérer.)
Mais en fin de compte, tu as esquivé la question : en quoi
est-ce que ces deux opérations diffèrent ? Qu'est-ce qu'ils font
de différent pour justifier un nom différent ?
J'avais remarqué, merci. Ce que je veux dire, c'est que
list<>::erase s'oriente (sémantiquement) vers la liste
elle-même, tandis que list <>::remove s'oriente
(sémantiquement) vers les éléments de la liste.
Ce qui veut dire quoi ? Tous les deux s'appliquent à une liste.
[...]Et je trouve que ça correspond bien avec la différence de
niveau auxquels s'appliquent les termes effacer et enlever.
Mais selon quel critère ? Tous les deux sont des verbes
transitifs, dont l'objet direct, ici, est l'élément. Si je
regarde le TLFI, effacer est « faire disparaître » ;
une des
définitions de « enlever », c'est « Déplacer un objet en le
sortant de l'endroit qu'il occupe [...] en l'effaçant, en le
supprimant ».
Dans le contexte ici, je crois qu'on peut dire qu'« enlever » a
la signification donnée en paragraphe II.C du TLFI. Où le
premier exemple est « enlever un nom d'une liste [...] ». Ce qui
est exactement ce que fait list<>::erase()
(et list<>::remove(),
évidemment, vue que les deux font la même chose).
Dans le cas d'« effacer », on n'est amené à considérer que les
significations du paragraphe I.A. (§II couvre les emplois
pronominaux, et §I.B les significations « Empêcher de
paraître@», qui ne me semble pas convenir non plus.) Or, parmi
les utilisations dans §I.A, la seule qui semblerait permise ici
est §I.A.1.b : « Éliminer, faire disparaître (quelque chose) ».
Et là non plus, pas le moindre soupçon que les critères de choix
de ce qu'on élimine entre en ligne de compte.
En somme, ta distinction d'« orientation » ne trouve pas de
justification dans la langue telle qu'elle s'emploie
généralement.
L'action d'effacer quelque chose se base sur ce quelque chose
et s'applique au contenu de ce quelque chose, alors que
l'action d'enlever quelque chose se base sur ce quelque chose
et s'applique à ce quelque chose lui-même.
Ce qui donne :
list<>::erase se base sur une partie de la liste et s'applique
à son contenu (ses éléments, qu'il ôte), alors que
list<>::remove se base sur des éléments déterminés (par moi)
de la liste, et s'applique sur ces éléments eux-mêmes (il les
ôte).
C'est moi qui détermine les éléments à enlever. Dans les deux
cas.
[...]Je trouve que ça justifie leur différence terminologique.
C'est tout ce que je voulais dire.
Mais pour ça, il faut que tu donnes aux mots une signification
qu'ils n'ont pas.
[...]Déterminés par qui ?
Par l'utilisateur. Dans tous les cas. Une fonction où c'est la
liste même qui détermine ce qu'elle veut enlever ne serait pas
particulièrement intéressante.
Dans list<>::erase, je ne détermine pas les éléments à ôter.
Bien sûr que si. C'est bien toi qui fournis l'itérateur ou les
itérateurs.
[...]Si les actions se résument pour toi à *ôter* et *déplacer*,
non.
Quelles sont les autres actions en question ?
[...]Je trouve ça comparable. Si ça t'étonne, tant pis.
On peut les utiliser pour atteindre les mêmes fins, dans certains
cas. C'est loin de signifier qu'elles font la même chose.
Tout dépend du degré de précision que tu donnes à la *chose*.
Pour moi, il y a une différence entre ôter des éléments
déterminés (au sens où *je* détermine), et ôter des éléments
qui correspondent à une partie déterminée de la liste.
On ôte des éléments déterminés dans les deux cas.
La seule
différence, c'est dans la manière de les déterminer. Or, au
moins en anglais, les mots « remove » et « erase » n'ont aucun
rapport avec la manière de choisir ce qui est enlevé ou ce qui
est effacé.
(Si on voulait chercher plus loin, on dirait que « remove »
enleve l'élément complétement, tandis qu'« erase » ne fait que
l'effacer, en laissant le support. C-à-d qu'« erase » appelerait
le destructeur, mais ne libèrerait pas la mémoire. Mais il ne
faut pas exagérer.)
Mais en fin de compte, tu as esquivé la question : en quoi
est-ce que ces deux opérations diffèrent ? Qu'est-ce qu'ils font
de différent pour justifier un nom différent ?
J'avais remarqué, merci. Ce que je veux dire, c'est que
list<>::erase s'oriente (sémantiquement) vers la liste
elle-même, tandis que list <>::remove s'oriente
(sémantiquement) vers les éléments de la liste.
Ce qui veut dire quoi ? Tous les deux s'appliquent à une liste.
[...]
Et je trouve que ça correspond bien avec la différence de
niveau auxquels s'appliquent les termes effacer et enlever.
Mais selon quel critère ? Tous les deux sont des verbes
transitifs, dont l'objet direct, ici, est l'élément. Si je
regarde le TLFI, effacer est « faire disparaître » ;
une des
définitions de « enlever », c'est « Déplacer un objet en le
sortant de l'endroit qu'il occupe [...] en l'effaçant, en le
supprimant ».
Dans le contexte ici, je crois qu'on peut dire qu'« enlever » a
la signification donnée en paragraphe II.C du TLFI. Où le
premier exemple est « enlever un nom d'une liste [...] ». Ce qui
est exactement ce que fait list<>::erase()
(et list<>::remove(),
évidemment, vue que les deux font la même chose).
Dans le cas d'« effacer », on n'est amené à considérer que les
significations du paragraphe I.A. (§II couvre les emplois
pronominaux, et §I.B les significations « Empêcher de
paraître@», qui ne me semble pas convenir non plus.) Or, parmi
les utilisations dans §I.A, la seule qui semblerait permise ici
est §I.A.1.b : « Éliminer, faire disparaître (quelque chose) ».
Et là non plus, pas le moindre soupçon que les critères de choix
de ce qu'on élimine entre en ligne de compte.
En somme, ta distinction d'« orientation » ne trouve pas de
justification dans la langue telle qu'elle s'emploie
généralement.
L'action d'effacer quelque chose se base sur ce quelque chose
et s'applique au contenu de ce quelque chose, alors que
l'action d'enlever quelque chose se base sur ce quelque chose
et s'applique à ce quelque chose lui-même.
Ce qui donne :
list<>::erase se base sur une partie de la liste et s'applique
à son contenu (ses éléments, qu'il ôte), alors que
list<>::remove se base sur des éléments déterminés (par moi)
de la liste, et s'applique sur ces éléments eux-mêmes (il les
ôte).
C'est moi qui détermine les éléments à enlever. Dans les deux
cas.
[...]
Je trouve que ça justifie leur différence terminologique.
C'est tout ce que je voulais dire.
Mais pour ça, il faut que tu donnes aux mots une signification
qu'ils n'ont pas.
[...]
Déterminés par qui ?
Par l'utilisateur. Dans tous les cas. Une fonction où c'est la
liste même qui détermine ce qu'elle veut enlever ne serait pas
particulièrement intéressante.
Dans list<>::erase, je ne détermine pas les éléments à ôter.
Bien sûr que si. C'est bien toi qui fournis l'itérateur ou les
itérateurs.
[...]
Si les actions se résument pour toi à *ôter* et *déplacer*,
non.
Quelles sont les autres actions en question ?
[...]
Je trouve ça comparable. Si ça t'étonne, tant pis.
On peut les utiliser pour atteindre les mêmes fins, dans certains
cas. C'est loin de signifier qu'elles font la même chose.
Tout dépend du degré de précision que tu donnes à la *chose*.
Pour moi, il y a une différence entre ôter des éléments
déterminés (au sens où *je* détermine), et ôter des éléments
qui correspondent à une partie déterminée de la liste.
On ôte des éléments déterminés dans les deux cas.
La seule
différence, c'est dans la manière de les déterminer. Or, au
moins en anglais, les mots « remove » et « erase » n'ont aucun
rapport avec la manière de choisir ce qui est enlevé ou ce qui
est effacé.
(Si on voulait chercher plus loin, on dirait que « remove »
enleve l'élément complétement, tandis qu'« erase » ne fait que
l'effacer, en laissant le support. C-à-d qu'« erase » appelerait
le destructeur, mais ne libèrerait pas la mémoire. Mais il ne
faut pas exagérer.)
Mais en fin de compte, tu as esquivé la question : en quoi
est-ce que ces deux opérations diffèrent ? Qu'est-ce qu'ils font
de différent pour justifier un nom différent ?
J'avais remarqué, merci. Ce que je veux dire, c'est que
list<>::erase s'oriente (sémantiquement) vers la liste
elle-même, tandis que list <>::remove s'oriente
(sémantiquement) vers les éléments de la liste.
Ce qui veut dire quoi ? Tous les deux s'appliquent à une liste.
[...]Et je trouve que ça correspond bien avec la différence de
niveau auxquels s'appliquent les termes effacer et enlever.
Mais selon quel critère ? Tous les deux sont des verbes
transitifs, dont l'objet direct, ici, est l'élément. Si je
regarde le TLFI, effacer est « faire disparaître » ;
une des
définitions de « enlever », c'est « Déplacer un objet en le
sortant de l'endroit qu'il occupe [...] en l'effaçant, en le
supprimant ».
Dans le contexte ici, je crois qu'on peut dire qu'« enlever » a
la signification donnée en paragraphe II.C du TLFI. Où le
premier exemple est « enlever un nom d'une liste [...] ». Ce qui
est exactement ce que fait list<>::erase()
(et list<>::remove(),
évidemment, vue que les deux font la même chose).
Dans le cas d'« effacer », on n'est amené à considérer que les
significations du paragraphe I.A. (§II couvre les emplois
pronominaux, et §I.B les significations « Empêcher de
paraître@», qui ne me semble pas convenir non plus.) Or, parmi
les utilisations dans §I.A, la seule qui semblerait permise ici
est §I.A.1.b : « Éliminer, faire disparaître (quelque chose) ».
Et là non plus, pas le moindre soupçon que les critères de choix
de ce qu'on élimine entre en ligne de compte.
En somme, ta distinction d'« orientation » ne trouve pas de
justification dans la langue telle qu'elle s'emploie
généralement.
L'action d'effacer quelque chose se base sur ce quelque chose
et s'applique au contenu de ce quelque chose, alors que
l'action d'enlever quelque chose se base sur ce quelque chose
et s'applique à ce quelque chose lui-même.
Ce qui donne :
list<>::erase se base sur une partie de la liste et s'applique
à son contenu (ses éléments, qu'il ôte), alors que
list<>::remove se base sur des éléments déterminés (par moi)
de la liste, et s'applique sur ces éléments eux-mêmes (il les
ôte).
C'est moi qui détermine les éléments à enlever. Dans les deux
cas.
[...]Je trouve que ça justifie leur différence terminologique.
C'est tout ce que je voulais dire.
Mais pour ça, il faut que tu donnes aux mots une signification
qu'ils n'ont pas.
[...]Déterminés par qui ?
Par l'utilisateur. Dans tous les cas. Une fonction où c'est la
liste même qui détermine ce qu'elle veut enlever ne serait pas
particulièrement intéressante.
Dans list<>::erase, je ne détermine pas les éléments à ôter.
Bien sûr que si. C'est bien toi qui fournis l'itérateur ou les
itérateurs.
[...]Si les actions se résument pour toi à *ôter* et *déplacer*,
non.
Quelles sont les autres actions en question ?
[...]Je trouve ça comparable. Si ça t'étonne, tant pis.
On peut les utiliser pour atteindre les mêmes fins, dans certains
cas. C'est loin de signifier qu'elles font la même chose.