Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

lista przekładanie ostatniego elementu

Ostatnio zmodyfikowano 2015-11-01 11:04
Autor Wiadomość
Asahel
Temat założony przez niniejszego użytkownika
» 2015-10-31 15:55:48
Dotarło to teraz do mnie, że ta lista się wydłuża. Przeziębienie robi swoje. Najprosciej chyba będzie wziąć wektor, wskaźnik i jakaś zmienną tymczasową.
P-139441
carlosmay
» 2015-10-31 16:00:35
C/C++
std::list < int > lista;
for( int i = 1; i <= 8; i++ )
     lista.push_back( i );

for( int el: lista ) cout << el << " ";

cout << endl;

typedef std::list < int >::iterator liter; // liter alias dla pelnej nazwy
liter iter, iter_end;
iter = lista.begin();

for( int i = 7; i > 1; i-- ) {
    iter_end = lista.end();
    --iter_end; // przesun iter_end na ostatni el listy
    int temp = * iter_end; // uzyj temp do przech wrtosci
   
    lista.erase( iter_end ); // usun ost
    iter_end = iter; // ustaw na poczatek
    advance( iter_end,( i - 1 ) ); // przesun na zadana pozycje
    lista.insert( iter_end, temp ); // wstaw przed na ustawiona poz i przesun reszte do tylu
}
for( int el: lista ) cout << el << " "; cout << endl;
 to nie jest takie trudne. Trzeba się z tym tylko obyć.
P-139442
Gibas11
» 2015-10-31 23:18:27
Palnąłem głupotę, nieważne.
P-139455
j23
» 2015-11-01 11:04:55
Inna wersja tego samego:
C/C++
std::list < int > lista;

for( int i = 1; i <= 8; i++ )
     lista.push_back( i );

for( int i = lista.size() - 1; i > 0; --i )
{
    auto it = lista.begin();
    std::advance( it, i );
    lista.insert( it, lista.back() );
    lista.pop_back();
}


Wersja zoptymalizowana, bez zbędnego kręcenia iteratorem:
C/C++
auto it = lista.end();

for( int i = lista.size() - 1; i > 0; --i )
{
    lista.insert( --it, lista.back() );
    --it;
    lista.pop_back();
}
P-139466
1 « 2 »
Poprzednia strona Strona 2 z 2