Invertire gli elementi di una lista

giuliomontenero
salve vorrei che qualcuno mi aiutasse a risolvere questo problemino
in C++ sto utilizzando le liste e vorrei una volta stampati tutti gli elementi
ristamparli nell'ordine invertito
ecco qui il programma che non funziona
ho utilizzato lo stesso programma che mi stampa il massimo in una lista
non riesco solamente a far stampare l'ordine inverso

#include <string>
#include <list>
#include <iostream>
using namespace std;

void maximum(list<string>& staff)
{
    string max="";
    list<string>::iterator pos;
    for(pos=staff.begin();pos!=staff.end();pos++)
    {
        if(*(pos)>max)
        max=*(pos);
    }
cout<<max<<endl;
for(pos=staff.begin();pos!=staff.end();pos++)
{
    cout<<*(pos)<<endl;
}
for(pos=(staff.end()).previous();!pos.is_null();pos=pos.previous())
{
    cout<<*(pos)<<endl;
}
}
int main()
{
list<string> staff;
staff.push_back("Harry");
staff.push_back("Vivian");
staff.push_back("Zack");
staff.push_back("Sam");
staff.push_back("Dick");
cout << "The maximum element in the list is " ;
maximum(staff);
return 0;
}




Risposte
Ska1
Ti basta scorrerla al contrario, usando al posto dell'iterator (dalla testa alla coda della lista), un reverse_iterator (dalla coda alla testa), con i metodi rbegin() e rend(), al posto di begin() ed end().

http://www.cplusplus.com/reference/stl/list/rbegin/

giuliomontenero
no guarda la funzione la devo implementare io non devo usare funzioni membro della libreria
e poi per scorrerla al contrario, cioè a partire dalla fine fino al primo elemento della lista non si fa come ho fatto io?
puoi dare un'occhiata al pezzo della scansione della lista al contrario?

Ska1
Questo è quello che il compilatore (g++ 4.6.1) mi restituisce cercando di compilare il tuo codice:
test.cpp: In function ‘void maximum(std::list<std::basic_string<char> >&)’:
test.cpp:20:23: error: ‘std::list<std::basic_string<char> >::iterator’ has no member named ‘previous’
test.cpp:20:39: error: ‘std::list<std::basic_string<char> >::iterator’ has no member named ‘is_null’
test.cpp:20:57: error: ‘std::list<std::basic_string<char> >::iterator’ has no member named ‘previous’


Ora dato che stai usando un container della STL, guardando sulla documentazione (http://www.cplusplus.com/reference/stl/list/ e http://www.cplusplus.com/reference/std/iterator/), dei metodi che usi non vedo l'ombra... e poi noto che ci sono i reverse_iterator, che servono per scorrere la lista dalla coda alla testa, quindi mi sembrano utili per il tuo problema, anche perchè è analogo alla stampa in ordine classico della lista:

#include <string>
#include <list>
#include <iostream>
using namespace std;

void stampa(list<string>& staff)
{
	cout << "Elementi in ordine di inserimento:" << endl;
	list<string>::iterator pos;
	for (pos=staff.begin(); pos != staff.end(); ++pos)
	{
		cout << *pos <<endl;
	}
	cout << "Elementi al contrario:" << endl;
	list<string>::reverse_iterator rpos;
	for (rpos = staff.rbegin(); rpos != staff.rend(); ++rpos)
	{
		cout << *rpos << endl;
	}
}
int main()
{
	list<string> staff;
	staff.push_back("Harry");
	staff.push_back("Vivian");
	staff.push_back("Zack");
	staff.push_back("Sam");
	staff.push_back("Dick");
	stampa(staff);
	return 0;
}

giuliomontenero
si ma come ho scritto prima non c'è un altro modo per scorrere la lista all'inverso?
partendo dall'ultimo elemento della lista fino ad arrivare al primo?

Ska1
	cout << "Elementi al contrario:" << endl;
	list<string>::iterator rpos = staff.end();
	do {
		--rpos;
		cout << *rpos << endl;
	} while (rpos != staff.begin());


Però non è immediato alla lettura, ed inoltre non capisco perchè ti stoni la soluzione con gli iteratori inversi, dato che sono fatti proprio per scorrere partendo dal fondo e risalendo fino all'inizio.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.