OVH Cloud OVH Cloud

Tableaux et stl

42 réponses
Avatar
JM
Bonjour

Toujours plongé dans la stl, j'ai quelques questions (Pas évident de
trouver un tutoriel à la fois clair et compréhensible)

0) Où peut-on trouver un bon tutoriel (Français de préférence, mais à
défaut, l'anglais me conviendra)

1)
J'ai une classe :
class CA
{public
CA() { initialisations divers et variées; }
~CA();

void f();
}

vector<CA> tableau;

tableau.size(10);

Le constructeur est-il bien appelé pour les 10 éléments?
Je pense que oui mais le doute est en moi.

2) Toujours avec la classe précédente.

Je veux ajouter un élément à la fin de mon tableau.
A priori, tableau.push_back ne peut-être utilisé sans passer de référence.

J'ai essayé deux trucs :
a) tableau.push_back(CA());

Vu que cela crée un objet temporaire sur la pile, cela ne me
convient pas trop.

b) tableau.resize(tableau.size()+1)

Cela me parait un peu bourrin, mais c'est le seul truc que j'ai pu
trouver dans les tutoriels que j'ai vus.


y'a-t-il d'autres possibilités, sachant que toutes les initialisations
dont j'ai besoin sont faites dans le constructeur?

3) Jusqu'à présent, style C oblige, j'utilisais toujours une variable
pour conserver la taille de mon tableau.

Je suppose que cette manière de faire est obsolète avec size() ?

Merci d'avance à ceux qui répondront à ces questions certainement niveau
0, mais j'avoue que cela m'aidera bien!

10 réponses

1 2 3 4 5
Avatar
loufoque

Ton programme fait quelque chose, non ? Tu en jettes les
résultats ? Ou est-ce qu'ils persistent quelque part (au moins
dans ta têtes, parce que tu les as vu affichés sur l'écrans) ?


Je veux bien les sauvegarder sur le disque dur, mais les laisser en RAM
(avec la mémoire partagée donc) je vois pas trop l'intérêt.

Avatar
loufoque

(En passant : pourquoi est-ce que parler de l'« ownership »
d'un objet me semble tout à fait naturel en anglais, mais que
l'utilisation du mot « propriété » dans le même contexte en
français ne me semble pas juste ?)


Peut-être à cause de l'ambiguïté avec « propriety »

Avatar
loufoque

Pourquoi ? Il faut bien synchroniser les accès ; dans notre
cas, on s'est servi des pthread_rwlock directement. Sinon, on
a remplacé l'allocateur, et ça a suffi. (La mémoire partagée, en
l'occurance, venait de mmap. Je ne sais pas pourquoi, mais c'est
beaucoup plus simple et plus efficace que le shmem de Posix.)


Ce que je voulais dire c'est que du coup on ne créé pas le conteneur
normalement et on y accède avec un pointeur.
Donc ce n'est pas un simple remplacement d'allocateur par rapport à une
utilisation normale, on passe par une espèce de "fabrique" qui maintient
des identifiants et des offsets pour chaque variable.

Avatar
kanze
loufoque wrote:

Ton programme fait quelque chose, non ? Tu en jettes les
résultats ? Ou est-ce qu'ils persistent quelque part (au moins
dans ta têtes, parce que tu les as vu affichés sur l'écrans) ?


Je veux bien les sauvegarder sur le disque dur, mais les
laisser en RAM (avec la mémoire partagée donc) je vois pas
trop l'intérêt.


Mais quel rapport entre la mémoire partagée et la persistance ?
Quand mes programmes terminent, la mémoire partagée cesse
d'exister.

--
James Kanze GABI Software
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


Avatar
kanze
loufoque wrote:

Pourquoi ? Il faut bien synchroniser les accès ; dans notre
cas, on s'est servi des pthread_rwlock directement. Sinon,
on a remplacé l'allocateur, et ça a suffi. (La mémoire
partagée, en l'occurance, venait de mmap. Je ne sais pas
pourquoi, mais c'est beaucoup plus simple et plus efficace
que le shmem de Posix.)


Ce que je voulais dire c'est que du coup on ne créé pas le
conteneur normalement et on y accède avec un pointeur.


D'accord. C'est vrai que pour les clients, c'est un peu
différent -- on fait un coup de mmap, et du coup, on a une
collection déjà faite, et même bien remplie.

Donc ce n'est pas un simple remplacement d'allocateur par
rapport à une utilisation normale, on passe par une espèce de
"fabrique" qui maintient des identifiants et des offsets pour
chaque variable.


Pas vraiment. Il y a bien un calcul de l'adresse après le mmap,
mais c'est tout. Ensuite, il fonctionne exactement comme
n'importe quel std::map. C'est vrai même pour le serveur, que
j'y pense. Sauf qu'il calcule l'adresse exactement comme font
les clients, puis il se sert d'un new de placement. Et ensuite,
c'est un std::map tout à fait comme un autre.

--
James Kanze GABI Software
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


Avatar
Sylvain
kanze wrote on 21/09/2006 09:09:

(En passant : pourquoi est-ce que parler de l'« ownership »
d'un objet me semble tout à fait naturel en anglais, mais que
l'utilisation du mot « propriété » dans le même contexte en
français ne me semble pas juste ?)


ou encore "possède" vs "utilise".

Ce qui veut dire alors que tu as dû implémenter quelque chose de
semblable, parce qu'avant, on n'avait que ce qu'on avait
implémenté nous-même.


tout à fait, pour les concepts de string et array; un temps marqué par
les OS sur lesquels j'utilisais ces outils (par exemple la toolbox MacOS
utilisait bcp de string-pascal, donc mes chaines était pascal et zéro
terminée); puis OS indépendant mais métier dépendant (la façon dont les
structures de données sont utilisées, par exemple souvent copiées ou
jamais, est marqué par la nature de l'application).

de fait switcher à la STL n'a jamais été ni requis ni parfois possible.

Sylvain.

Avatar
loufoque

Mais quel rapport entre la mémoire partagée et la persistance ?
Quand mes programmes terminent, la mémoire partagée cesse
d'exister.


Ben c'est Sylvain qui a commencé à parler de mémoire partagée pour faire
des objets persistants.
Je ne fais que dire que je voyais pas l'intérêt d'un tel type de
persistance. (après, je connais pas vraiment la programmation sur PDA
non plus)

Avatar
Alain Gaillard


utilisait bcp de string-pascal, donc mes chaines était pascal et zéro
terminée);


Des chaînes pascal zéro terminées ? Ah bon ?

--
Alain

Avatar
Sylvain
loufoque wrote on 21/09/2006 18:51:

Mais quel rapport entre la mémoire partagée et la persistance ?
Quand mes programmes terminent, la mémoire partagée cesse
d'exister.


Ben c'est Sylvain qui a commencé à parler de mémoire partagée pour faire
des objets persistants.


non j'ai dit que définir *son* mécanisme allocator permettait de gérer
des objets partagées en mémoire *ou* de gérer des objets persistants.

ce sont 2 exemples distincts, merci de relire.

Sylvain.


Avatar
Sylvain
Alain Gaillard wrote on 21/09/2006 19:04:

Des chaînes pascal zéro terminées ? Ah bon ?


je disais /à la fois/ préfixée de leur longueur (avec contraite de
longueur max.) pour être transmisse à certaines API /et/ zéro terminée
pour être utilisée par les fonctions de string.h

c'était juste une anecdote, plus personne aujourd'hui n'utilise la
toolbox MacOS ...

Sylvain.

1 2 3 4 5