Modifiqueu la classe List per tal d’afegir els operadors
+= i -= a la
subclasse iterador. Aquests mètodes reben un enter, i desplacen
l’iterador cap endavant i cap enrere, respectivament, tantes posicions
com indica aquest enter. Noteu que, si l’enter és negatiu,
+= mourà l’iterador cap enrere, i
-= mourà l’iterador cap endavant. S’assumeix
que els paràmetres no fan que l’iterador se surti del rang de la
llista.
D’entre els fitxers que s’adjunten en aquest exercici, trobareu
list.old.hpp, a on hi ha una implementació de
la classe genèrica List. En primer lloc,
haureu de fer:
cp list.old.hpp list.hpp
A continuació, haureu de buscar dins
list.hpp les següents línies:
// Pre: x és un enter tal que, si desplacem l'iterador implícit x unitats cap endavant
// (que implicarà moure'l -x unitats cap enrere si x és negatiu), no se surt de rang.
// Post: l'iterador implícit s'ha mogut x unitats cap endavant (cosa que haurà implicat
// moure'l -x unitats cap enrere en el cas que x sigui negatiu, o no moure'l si x és 0).
// Descomenteu les següents dues linies i implementeu el mètode:
// void operator+=(int x) {
// }
// Pre: x és un enter tal que, si desplacem l'iterador implícit x unitats cap enrere
// (que implicarà moure'l -x unitats cap endavant si x és negatiu), no se surt de rang.
// Post: l'iterador implícit s'ha mogut x unitats cap enrere (cosa que haurà implicat
// moure'l -x unitats cap endavant en el cas que x sigui negatiu, o no moure'l si x és 0).
// Descomenteu les següents dues linies i implementeu el mètode:
// void operator-=(int x) {
// }
Descomenteu les quatre linies que s’indiquen i implementeu els mètodes. 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
program.cpp (programa principal) i
Makefile per a compilar. Per a pujar la vostra
solució, heu de crear el fitxer solution.tar
així:
tar cf solution.tar list.hpp
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 un iterador que se suposa situat 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
it+= x (x és un enter)
it-= x (x és un enter)
*it
Se suposa que la seqüència d’entrada serà correcta (sense
pop_front ni
pop_back sobre llista buida, ni
it tenint it situat
al end de la llista). Tampoc hi haurà
pop_front just quan l’iterador estigui
apuntant al primer element de la llista, ni hi haurà
pop_back just quan l’iterador estigui apuntant
a l’últim element de la llista (tingueu en compte que l’últim element de
la llista no és el end de la llista). A més a
més, els paràmetres x són tals que l’iterador no se surt de rang.
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.
Per a cada instrucció it, 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
it+= 0 it-= 0 push_front a it-= 1 *it it+= 1 it-= 1 *it it-= -1 it+= -1 *it push_back b it+= 1 *it it+= -1 *it it-= -1 *it it-= 1 *it push_front c it-= 1 *it it+= 3 it-= 1 *it it+= -2 *it push_front d push_back e it-= -3 *it it+= -4 *it
Output
a a a b a b a c b c e d
Input
push_front e it-= 1 it-= 0 push_back g it-= -2 it+= -2 *it push_front s pop_front push_front di pop_back pop_front push_front il it-= -1 it-= 1 push_front tq it+= -2 pop_back it+= 1 pop_front it+= 1 it+= -1 it-= -1 it-= 0 it+= -1 it+= 0 *it push_front ly push_back j *it pop_back it+= -1 pop_back push_back pd pop_back it+= 0 push_front j it-= 1 push_back p it-= -1 push_front k pop_front pop_front push_front f it+= 1 it+= -1 *it pop_front push_back ft *it push_back w it-= -1 *it *it *it pop_front pop_back *it it+= 1 pop_front *it
Output
e il il ly ly p p p p ft
Input
it-= 0 push_back os pop_front it-= 0 push_back pe it+= 0 push_front is pop_back push_back di push_back v pop_front it-= 1 push_front vu push_front tq push_back v *it it-= 1 pop_front pop_back *it it+= -1 push_back yr pop_back *it it+= 1 *it it+= 2 push_back yf push_back sj push_front h push_front pd pop_back push_back k it+= -2 push_back cg push_front pb pop_front push_front q pop_front it-= 5 *it
Output
v di vu di pd