Implementeu un nou mètode de la classe List que rebi dos iteradors i intercanvii de posició els elements (items) apuntats per aquests iteradors. Això vol dir que cadascun d’aquests elements passarà a ocupar la posició dins la llista que ocupava l’altre element. Els iteradors no han de canviar. Per tant, cadascun ha de seguir apuntant a la mateixa memòria. Els valors dels elements tampoc han de canviar.
D’entre els fitxers que s’adjunten en aquest exercici, trobareu list.hh, a on hi ha una implementació de la classe genèrica List. Haureu de buscar dins list.hh les següents línies:
// Pre: it1,it2 apunten a elements de la llista implícita. // Post: it1,it2 continuen apuntant als mateixos elements, // i *it1, *it2 continuen valent el mateix que abans. // però *it1 ocupa la posició que ocupava abans *it2, // i *it2 ocupa la posició que ocupava abans *it1. // A part d'això, res més ha canviat. // No s'ha creat ni eliminat memòria. // Descomenteu les següents dues linies i implementeu el mètode: // void swapPositionsOfItems(iterator &it1, iterator &it2) { // }
Descomenteu les dues linies que s’indiquen i implementeu el mètode. No toqueu la resta de la implementació de la classe, excepte si, per algun motiu, considereu que necessiteu afegir algun mètode auxiliar a la part privada.
D’entre els fitxers que s’adjunten a l’exercici també hi ha main.cc (programa principal), i el podeu compilar directament, doncs inclou list.hh. Només cal que pugeu list.hh al jutge.
Entrada
La entrada del programa és una seqüència d’instruccions del següent tipus que s’aniran aplicant sobre una llista que se suposa inicialment buida i dos iteradors it1, it2, que se suposen situats inicialment al principi (i final) d’aquesta llista:
push_front s (s és un string) push_back s (s és un string) pop_front pop_back it1++ it1-- it2++ it2-- *it1 *it2 swapPositionsOfItems
Se suposa que la seqüència d’entrada serà correcta (sense pop_front sobre llista buida ni amb algun dels iteradors apuntant al primer element de la llista, ni pop_back sobre llista buida ni amb algun dels iteradors apuntant a l’últim element de la llista, ni ++ ni * sobre iterador apuntant al end de la llista, ni -- sobre iterador apuntant al principi de la llista, ni swapPositionsOfItems quan algun dels iteradors apunta al end de la llista. Fixeu-vos que el end de la llista no és l’últim element de la llista).
El programa principal que us oferim ja s’encarrega de llegir aquestes entrades i fer les crides als corresponents mètodes de la classe list. Només cal que implementeu els mètodes abans esmentats.
Sortida
Per a cada instrucció *it1 o *it2, s’escriurà el contingut apuntat per l’iterador. El programa que us oferim ja fa això. Només cal que implementeu el mètode abans esmentat.
Input
push_front a it1-- push_back b it2-- *it1 *it2 swapPositionsOfItems *it1 *it2 it1-- *it1 *it2 swapPositionsOfItems *it1 *it2 push_back c it2++ *it2 it2++ *it1 *it2 swapPositionsOfItems *it1 *it2 swapPositionsOfItems *it1 *it2 it2-- it2-- it1++ it1++ *it1 *it2 swapPositionsOfItems *it1 *it2 it1++ *it1 it2-- *it2 swapPositionsOfItems *it1 *it2
Output
a b a b b b b b a b c b c b c c b c b a a a a
Input
push_front nk push_back gn push_front x push_back o it1-- pop_front push_back ir push_front wp *it1 pop_back push_back t it1++ push_back ap push_front v pop_front push_back v it1++ pop_front pop_front it2-- it1-- it1-- swapPositionsOfItems it2-- push_back p *it2 push_back p swapPositionsOfItems it1++ push_back d *it2 pop_front it2-- *it1 push_back iz swapPositionsOfItems *it1 it1++ pop_back push_front q *it2 pop_back it2++ swapPositionsOfItems push_front l *it1 push_front b push_front g push_back yo pop_front it1++ push_back y it2-- push_front g *it1
Output
o gn gn v v ap gn v