Discussione:
Spostamento elemento tra due std::list
(troppo vecchio per rispondere)
_merlinO_
2019-09-16 13:50:09 UTC
Permalink
Mi sono trovato con un problema che per il momento non sono riuscito a risolvere in modo elegante.
Ho una lista di persone:

std::list<Person> people;


da questa lista voglio estrarre tutte le persone che soddisfano una condizione e spostarle in una seconda lista dello stesso tipo:

std::list<Person> selectedPeople;

La prima soluzione che ho trovato è un ciclo con un if, se la condizione è soddisfatta copia l'elemento nella seconda lista e lo cancella dalla prima.

it = people.begin();

while(it != people.end())
{
if( <condition> )
{
selectedPeople.push_back(*it);
it = people.erase(it);
continue;
}

++it;
}

Questa soluzione funziona, ma passa attraverso la copia dell'elemento, cosa che vorrei evitare: di una persona (elemento) dovrebbe esistere sempre e solo un'istanza univoca non copiabile. Quindi bisognerebbe fare proprio una move da una lista all'altra.

Ho provato con splice, ma senza successo, mi pare sia una funzione più orientata a spostare intere sezioni tra liste, piuttosto che un elemento solo.

selectedPeople.splice(selectedPeople.end(), people, it, it);

Secondo voi qual è l'approccio migliore?
enoquick
2019-10-03 15:20:46 UTC
Permalink
Post by _merlinO_
Mi sono trovato con un problema che per il momento non sono riuscito a risolvere in modo elegante.
std::list<Person> people;
std::list<Person> selectedPeople;
La prima soluzione che ho trovato è un ciclo con un if, se la condizione è soddisfatta copia l'elemento nella seconda lista e lo cancella dalla prima.
it = people.begin();
while(it != people.end())
{
if( <condition> )
{
selectedPeople.push_back(*it);
it = people.erase(it);
continue;
}
++it;
}
Questa soluzione funziona, ma passa attraverso la copia dell'elemento, cosa che vorrei evitare: di una persona (elemento) dovrebbe esistere sempre e solo un'istanza univoca non copiabile. Quindi bisognerebbe fare proprio una move da una lista all'altra.
Ho provato con splice, ma senza successo, mi pare sia una funzione più orientata a spostare intere sezioni tra liste, piuttosto che un elemento solo.
selectedPeople.splice(selectedPeople.end(), people, it, it);
Secondo voi qual è l'approccio migliore?
for (auto& person : people)
selectPeople.push_back(std::move(person));

ovviamente la classe Person deve avere Person(Person&&) se no copia
--
|___|
_merlinO_
2019-10-04 07:55:13 UTC
Permalink
Post by enoquick
Post by _merlinO_
Mi sono trovato con un problema che per il momento non sono riuscito a risolvere in modo elegante.
std::list<Person> people;
std::list<Person> selectedPeople;
La prima soluzione che ho trovato è un ciclo con un if, se la condizione è soddisfatta copia l'elemento nella seconda lista e lo cancella dalla prima.
it = people.begin();
while(it != people.end())
{
if( <condition> )
{
selectedPeople.push_back(*it);
it = people.erase(it);
continue;
}
++it;
}
Questa soluzione funziona, ma passa attraverso la copia dell'elemento, cosa che vorrei evitare: di una persona (elemento) dovrebbe esistere sempre e solo un'istanza univoca non copiabile. Quindi bisognerebbe fare proprio una move da una lista all'altra.
Ho provato con splice, ma senza successo, mi pare sia una funzione più orientata a spostare intere sezioni tra liste, piuttosto che un elemento solo.
selectedPeople.splice(selectedPeople.end(), people, it, it);
Secondo voi qual è l'approccio migliore?
for (auto& person : people)
selectPeople.push_back(std::move(person));
ovviamente la classe Person deve avere Person(Person&&) se no copia
Sono definiti tutti gli operatori = e costruttori, sia per copia che per movimento.
CortexA57
2019-10-07 08:32:41 UTC
Permalink
Post by _merlinO_
Questa soluzione funziona, ma passa attraverso la copia dell'elemento, cosa che vorrei evitare: di una persona (elemento) dovrebbe esistere sempre e solo un'istanza univoca non copiabile. Quindi bisognerebbe fare proprio una move da una lista all'altra.
una una linked list e sposta solo il link da una lista all' altra, non
hai bisogno di copiare nulla.
AA.
_merlinO_
2019-10-07 09:56:49 UTC
Permalink
Post by CortexA57
una una linked list e sposta solo il link da una lista all' altra, non
hai bisogno di copiare nulla.
a che tipo ti riferisci di presciso?
CortexA57
2019-10-07 10:50:50 UTC
Permalink
Post by _merlinO_
Post by CortexA57
una una linked list e sposta solo il link da una lista all' altra, non
hai bisogno di copiare nulla.
a che tipo ti riferisci di presciso?
Vedi un po' questo, mi sembra abbastanza chiaro:
https://www.geeksforgeeks.org/data-structures/linked-list/

Comunque se cerchi, trovi molto materiale ;-)

aa
_merlinO_
2019-10-07 12:29:20 UTC
Permalink
Post by CortexA57
https://www.geeksforgeeks.org/data-structures/linked-list/
Comunque se cerchi, trovi molto materiale ;-)
Ti ringrazio, sì so che in rete c'è molto ma il mio era uno studio sulle collezioni della STL library. Tra poco posto un nuovo topic più focalizzato sulle differenze utilizzando puntatori oppure no.
Loading...