Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Spostamento elemento tra due std::list

26 views
Skip to first unread message

_merlinO_

unread,
Sep 16, 2019, 9:50:11 AM9/16/19
to
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

unread,
Oct 3, 2019, 11:20:50 AM10/3/19
to
Il 16/09/19 08:50, _merlinO_ ha scritto:
for (auto& person : people)
selectPeople.push_back(std::move(person));

ovviamente la classe Person deve avere Person(Person&&) se no copia


--
|___|

_merlinO_

unread,
Oct 4, 2019, 3:55:15 AM10/4/19
to
Sono definiti tutti gli operatori = e costruttori, sia per copia che per movimento.

CortexA57

unread,
Oct 7, 2019, 4:32:39 AM10/7/19
to
Il 04/10/2019 09:55, _merlinO_ ha scritto:
>>> 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_

unread,
Oct 7, 2019, 5:56:51 AM10/7/19
to
Il giorno lunedì 7 ottobre 2019 10:32:39 UTC+2, CortexA57 ha scritto:

> 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

unread,
Oct 7, 2019, 6:50:49 AM10/7/19
to
Vedi un po' questo, mi sembra abbastanza chiaro:
https://www.geeksforgeeks.org/data-structures/linked-list/

Comunque se cerchi, trovi molto materiale ;-)

aa

_merlinO_

unread,
Oct 7, 2019, 8:29:21 AM10/7/19
to
Il giorno lunedì 7 ottobre 2019 12:50:49 UTC+2, CortexA57 ha scritto:

> Vedi un po' questo, mi sembra abbastanza chiaro:
> 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.
0 new messages