OVH Cloud OVH Cloud

STL : vector

5 réponses
Avatar
Gib
Bonjour

vector <int>v ;
v.insert(v.begin().1) // Ici j'insère 1 en dans la première case de v

vector <int>::iterator itl ;
itl=v.begin() : itl++;
v.insert (itl,2) /* Est ce que ici j'insére 2 dans la case
pointé par itl ou avant la case pointé par itl ???????
J'insére dans la 1er case ou la 2nd case
de v ????


Merci

5 réponses

Avatar
Patrick Mézard
Gib wrote:
Bonjour

vector <int>v ;
v.insert(v.begin().1) // Ici j'insère 1 en dans la première case de v


Tu peux aussi écrire :

v.push_back(1)

vector <int>::iterator itl ;
itl=v.begin() : itl++;


std::vector<> est un conteneur à accès aléatoire, tu peux écrire plus
simplement :

vector<int>::iterator itl = v.begin()+1;

Note que dans ton cas itl==v.end()

v.insert (itl,2) /* Est ce que ici j'insére 2 dans la case
pointé par itl ou avant la case pointé par itl ???????
J'insére dans la 1er case ou la 2nd case
de v ????


http://www.sgi.com/tech/stl/Sequence.html :

"
a.insert(p, t) : A copy of t is inserted before p. [2] [3]

[2] Note that p equal to a.begin() means to insert something at the
beginning of a (that is, before any elements already in a), and p equal
to a.end() means to append something to the end of a.
"

Donc tu insères ton élément en fin de séquence. Attention, itl n'est
plus valide après l'insertion.

Patrick Mézard

Avatar
Gib
Patrick Mézard wrote:
Tu peux aussi écrire :

v.push_back(1)


Je n'ai pas remarqué qu'il existait aussi ses méthodes pour vector, pensant
que c'etait uniquement pour list....
Merci de me l'avoir montré !

Ok j'ai compris le fonctionne de "insert" :-)

Merci

Gib

Avatar
Alexandre BACQUART
Gib wrote:

Patrick Mézard wrote:

Tu peux aussi écrire :

v.push_back(1)



Je n'ai pas remarqué qu'il existait aussi ses méthodes pour vector, pensant
que c'etait uniquement pour list....
Merci de me l'avoir montré !


C'est souvent le cas, un des avantages étant de passer de vector à list
ou je ne sais quoi en ne changeant que la déclaration.


--
Tek


Avatar
Antonio DA SILVA
Je n'ai pas remarqué qu'il existait aussi ses méthodes pour vector,
pensant


que c'etait uniquement pour list....
Merci de me l'avoir montré !


C'est souvent le cas, un des avantages étant de passer de vector à list
ou je ne sais quoi en ne changeant que la déclaration.


En effet, le passage de list à vector et réciproquement est aisé. Un autre
conteneur, qui gangnerait à être connu, est le deque, il regroupe en gros
les interfaces de vector et list.

On se demande pourquoi avoir "quasi la même chose" avec ces conteneurs.
Et bien il y a des différences fondamentales entre le vector et la list.
Dans un vector, la mémoire est "consécutives" (tableau) pour ses éléments,
si une insertion dépasse sa taille, tout est réalloué. Pour la liste,
il y juste insertion d'un nouveau maillon (liste chainée) créé n'importe où
en
mémoire.
vector ==> faible coût mémoire mais réallocations couteûses,
list ==> plus gros coût mémoire mais pas de réallocation.

Par ailleurs, comme la liste se trouve "disséminée" en mémoire,
perte d'optimisation de cache mémoire et pas d'accès direct à un élément.
Pour le vecteur, comme les données sont contigües, performance
d'accès et accès direct à un élément quelconque.

Ces considérations doivent orienter les choix pour tel ou tel container.

A+


Avatar
Patrick Mézard
Antonio DA SILVA wrote:
Je n'ai pas remarqué qu'il existait aussi ses méthodes pour vector,



pensant

que c'etait uniquement pour list....
Merci de me l'avoir montré !


C'est souvent le cas, un des avantages étant de passer de vector à list
ou je ne sais quoi en ne changeant que la déclaration.



En effet, le passage de list à vector et réciproquement est aisé. Un autre
conteneur, qui gangnerait à être connu, est le deque, il regroupe en gros
les interfaces de vector et list.

On se demande pourquoi avoir "quasi la même chose" avec ces conteneurs.
Et bien il y a des différences fondamentales entre le vector et la list.
Dans un vector, la mémoire est "consécutives" (tableau) pour ses éléments,
si une insertion dépasse sa taille, tout est réalloué. Pour la liste,
il y juste insertion d'un nouveau maillon (liste chainée) créé n'importe où
en
mémoire.
vector ==> faible coût mémoire mais réallocations couteûses,
list ==> plus gros coût mémoire mais pas de réallocation.


L'invalidation des itérateurs après telles ou telles operation est aussi
un critère de choix important. Cela permet ou non l'utilisation
conjointe de plusieurs conteneurs, l'un contenant des itérateurs sur des
éléments de l'autre.

Patrick Mézard