Dans le cour sur les conteneurs, j'ai cru comprendre qu'un des avantages des listes chainées est de pouvoir modifier un élément quelconque (pas seulement le début et la fin), mais il n'y avait pas d'exemple concret (juste des exemples permettant de les parcourrir avec un itérateur). Alors ma question est la suivante: comment modifier l'élément situé au milieu par exemple?
Un cours ne peut contenir les dizaines de milliers de fonctions de la bibliothèque standard. Pour plus d'information il faut voir la doc des std::list.
Le problème que tu rencontres est : comment accéder au milieu d'une std::list. Et là, il n'y a pas vraiment de solution car il n'existe aucun moyen d'accéder à un élément autre que les extrémités, les autres éléments ne sont trouvés qu'après un parcours.
// ôter l'élément qui vaut 3
std::list<int> liste{0,1,2,3,4,5};
auto iter = std::find( liste.begin(), liste.end() , 3 );
liste.erase( iter ); // supprimer l'élément trouvé
int main()
{
vector<string> svect{"abbc","test","45dd5q5","98ded8"};
list <string> slist{"abbc","test","45dd5q5","98ded8"};
svect.insert(svect.begin()+2,"here");
for(auto it = svect.begin(); it != svect.end(); ++it)
cout<<*it<<" ";
cout<<endl;
auto itl = find(slist.begin(),slist.end(),"test");
slist.insert((++itl),"ok!");
for(auto it = slist.begin(); it != slist.end(); ++it)
cout<<*it<<" ";
cout<<endl;
return 0;
}
Ok. Merci bcp pour vos corrections.
Mais, Fvirtman, avec le code précédent, (qui se compile bien), je suis arrivé à insérer dans un "vector" un élément quelconque à une place quelconque. Du coup, je ne vois plus trop la nuance, ou l'avantage des listes par rapport aux autres conteneurs.
NB: l'exécution est bonne.
- Edité par GiovanniAgbocou 9 février 2019 à 23:59:20
La nuance est subtile. Insérer dans un std::vector veut dire déplacer tous les éléments. Le déplacement invalide les références, là où l'insertion dans une liste n'ajoute qu'un maillon entre 2 maillons. Les éléments ne bougent pas au niveau de la mémoire, seuls les liaisons sont différentes.
#include <vector>
#include <list>
#include <iterator>
int main()
{
{
std::vector<int> v{1,2,3};
auto it = std::next(v.begin());
int& une_ref = *it; // une référence sur 2
v.insert(it, 4);
// Ici, une_ref ne correspond plus à 2, mais à 4.
// Voir même à une zone mémoire invalide si le v a fait une allocation
// il en va de même pour it
}
{
std::list<int> l{1,2,3};
auto it = std::next(l.begin());
int& une_ref = *it; // une référence sur 2
l.insert(it, 4);
// Ici, une_ref est toujours sur 2 et it aussi
}
}
Dans les faits, std::vector est préférable à std::list qui n'est pas très efficace au niveau mémoire. Les avantages des listes existent, mais dans des cas très particuliers. À mon d'avoir une réelle raison ou des benchmarks à l’appui, le plus simple est d'utiliser std::vector.
- Edité par jo_link_noir 10 février 2019 à 1:30:25
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
En recherche d'emploi.
Recueil de code C et C++ http://fvirtman.free.fr/recueil/index.html