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

Conteneur séquentiel et transformation

35 réponses
Avatar
Mickaël Wolff
Bonjour,

Quelle est la raison fondamentale pour laquelle std::transform
nécessite une séquence de sortie pré-dimensionnée ?

Par exemple:

#include <vector>

int main()
{
int ref[] = { 1, 36, 69, 42 } ;

std::vector<int> reference ;
reference.resize(sizeof ref / sizeof *ref) ;

std::transform(ref, ref + reference.size(), reference.begin()) ;
}

Si je n'ajuste pas reference, il reste vide. Dans un exemple plus
complexe, j'ai du segfault: avec des shared_ptr, swap tente d'échanger
le pointeur courant avec le pointeur courant d'un emplacement mémoire
qui n'est pas un shared_ptr.

Je comprends que std::transform ne redimensionne pas mon std::vector
de destination. La raison est-elle qu'on paye pour ce qu'on utilises ?

Au plaisir de vous lire.
--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org

5 réponses

1 2 3 4
Avatar
espie
In article ,
Gabriel Dos Reis wrote:
L'un des apports fondamentaux de la STL, c'est le découplage des
conteneurs des algorithmes, via la notion d'itérateur et leur
classification en termes de complexité d'opérations basiques.



Ouais, enfin, fondamentaux, c'est tout relatif quand meme...
Avatar
Gabriel Dos Reis
(Marc Espie) writes:

| In article ,
| Gabriel Dos Reis wrote:
| >L'un des apports fondamentaux de la STL, c'est le découplage des
| >conteneurs des algorithmes, via la notion d'itérateur et leur
| >classification en termes de complexité d'opération s basiques.
|
| Ouais, enfin, fondamentaux, c'est tout relatif quand meme...

Je ne comprends pas ce que tu veux dire.

-- Gaby
Avatar
Gabriel Dos Reis
James Kanze writes:

[...]

| > > ou un conteneur. C'es une bonne question.
| > > La réponse traditionnelle est le manque de propostion dans ce se ns.
| > > Certaines personnes diront qu'il y a certains idiomes qui ne sont pas
| > > possible avec les paires d'itérateurs. Ma réponse est  « et alors ? »
| > > On ne peut pas faire de la choucroute avec ls itérateurs non plu s.
|
| > Par curiosité, quels idiomes sont impossibles avec la paire
| > d'itérateurs ?
|
| Les idioms qui n'exigent qu'un seul itérateur ? Comment définir
| un back_insertion_iterator s'il faut une paire d'itérateurs. (En
| fait, c'est possible, de la même façon que istream_iterator est
| possible même dans les cas où on a besoin de deux itérateu rs :
| on définit un itérateur « factice » dont la comparaison fait ce
| qu'on veut. Mais c'est pas commode.)

Tu m'as oté le mot de la bouche -- l'itérateur de fin de
istream_iterator est factice. C'est un élément qui montre que la notion
d'itérateur telle que présentée dans la SL n'est pas univers elle.
Il y a bien d'autres modèles où il faut autre chose de beaucoup p lus naturel.

-- Gaby
Avatar
espie
In article ,
Gabriel Dos Reis wrote:
(Marc Espie) writes:

| In article ,
| Gabriel Dos Reis wrote:
| >L'un des apports fondamentaux de la STL, c'est le découplage des
| >conteneurs des algorithmes, via la notion d'itérateur et leur
| >classification en termes de complexité d'opérations basiques.
|
| Ouais, enfin, fondamentaux, c'est tout relatif quand meme...

Je ne comprends pas ce que tu veux dire.



Je trouve toujours extremement pompeux la facon dont sont presentes
"les algorithmes" de la STL. C'est verbeux, c'est moche, le systeme
de types est limite casse (la gestion des const qui oblige a separer
iterator et const_iterator en deux trucs incompatibles), et ca fait qu'on se
retrouve avec auto en C0x, parce que ca devenait vraiment tres illisible.

Alors, le fondamental, je ne sais pas trop par rapport a quoi. En tout
c'est clairement vachement moins elegant que les collections de smalltalk
(mutatis mutandi, vu qu'on est sur un langage qui essaie a la fois de faire
dans le typesafe et les cradouilleries a la C).

Je pense qu'il y a pire, mais c'est toujours deprimant de voir presente
comme un "apport fondamental" un truc qui devrait etre tout petit et
relativement evident... mais bon, vu qu'il n'y a rien de plus gros et
fondamental a cote, je suppose qu'on peut dire que c'est fondamental...
Avatar
Gabriel Dos Reis
(Marc Espie) writes:

| In article ,
| Gabriel Dos Reis wrote:
| > (Marc Espie) writes:
| >
| >| In article ,
| >| Gabriel Dos Reis wrote:
| >| >L'un des apports fondamentaux de la STL, c'est le dà©couplage des
| >| >conteneurs des algorithmes, via la notion d'ità©rateur et leur
| >| >classification en termes de complexité d'opà ƒÆ’Ã‚Â©rations basiques.
| >|
| >| Ouais, enfin, fondamentaux, c'est tout relatif quand meme...
| >
| >Je ne comprends pas ce que tu veux dire.
|
| Je trouve toujours extremement pompeux la facon dont sont presentes
| "les algorithmes" de la STL. C'est verbeux, c'est moche, le systeme
| de types est limite casse (la gestion des const qui oblige a separer
| iterator et const_iterator en deux trucs incompatibles), et ca fait qu'on se
| retrouve avec auto en C0x, parce que ca devenait vraiment tres illisible.

Je crois qu'il faut faire une différence entre la STL telle qu'exprim ée
en C++98, et la notion d'exprimer des algroithmes sur la base d'iterateur.

Est-ce que tu émets la meme opinion après avoir considérà © « Elements of
Programming »

http://www.elementsofprogramming.com/

?

J'ai eu une élève en 3 ième année d'université qui a travaillé dessus
et qui n'a pas eu de problème à se plonger dedans alors qu'elle n 'avait
pratiquement pas d'exposition à la STL avant.

http://parasol.tamu.edu/people/villoria/

| Alors, le fondamental, je ne sais pas trop par rapport a quoi. En tout

Le « fondamental », cela fait référence aux opérat ions supportées par
les « itérateurs. »

| c'est clairement vachement moins elegant que les collections de smalltalk
| (mutatis mutandi, vu qu'on est sur un langage qui essaie a la fois de fai re
| dans le typesafe et les cradouilleries a la C).
|
| Je pense qu'il y a pire, mais c'est toujours deprimant de voir presente

C'est toujours bien de savoir que tout est relatif :-)
Mais j'aurais voulu savoir ton alternatif à la STL et qui a eu autant
d'impact que la STL dans le cadre de C++. L'approche Smalltalk ne vient
même pas à la cheville, puisque son approche rejette déjà   les type
basics, et elle force une allocation d'objet là où ce n'est ni
nécessaire ni souhaité.

Il y a une chose qui passe souvent inarperçu, c'est que la STL est
l'aboutissement d'une recherche une plusieurs années, avec des versions
essayées dans plusieurs langages (Scheme, Ada, etc.) avant que Stepanov
découvre que le C++ de 90-92 offrait plus d'expressivité que tout ce
qu'il a pu considérer avant. Note que le cas d'Ada a donné lieu aussi à
une bibliothèque « standard »

| comme un "apport fondamental" un truc qui devrait etre tout petit et
| relativement evident... mais bon, vu qu'il n'y a rien de plus gros et
| fondamental a cote, je suppose qu'on peut dire que c'est fondamental...

-- Gaby
1 2 3 4