Lista c++ , iteratory

0

Mam problem z takim oto kodem

 
#include <iostream>
using namespace std;
#include <cstdlib>
#include <list>
list<int>lista;
int main()
{
    list<int>::iterator it;
    int liczba;
    cin >> liczba;
    for(int i=1;i<=liczba;++i)
    {
        lista.push_back(i);
    }
	it=lista.begin();
	++it; // ustawiam liste na 2 element
	while(lista.size()>1) 
	{
		it = lista.erase(it);
		++it;
		if(it==lista.end())
		{
			it=lista.begin();
		}
		
	}
	it = lista.begin();
	cout << "\n" << *it << "\n";
	
    system("pause");
}

Moze opisze slownie o co chodzi. A wiec podajemy liczbe ile ma byc elementow w liscie nastepnie program dodaje elementy 1,2...liczba do listy. Ustawiam liste na 2 element. Wchodze do petli while. Usuwam ten element (czyli 2) element kolejny czyli 3 zostawiam i przechodze do 4 i ja usuwam itd az w koncu dojde do konca listy i wracam na poczatek. Calosc powtarzam az zostanie mi 1 element. Tylko ze wyskakuje mi blad List iterator not incrementable

Jak to rozwiazac bo mecze sie juz dlugo nad tym kawalkiem kodu i bez efektow

0

a po co tak? nie lepiej

for (list<int>::iterator itfor = it; itfor != lista.end() ;)
{
  itfor = lista.erase(itfor);
}

btw
http://www.cplusplus.com/reference/stl/list/erase/

A bidirectional iterator pointing to the new location of the element that followed the last element erased by the function call, which is the list end if the operation erased the last element in the sequence.

i czemu na liście a nie na vectorze?
Twój kod się kompiluję dla wartości 5 np ale pokazuje nie to co chcesz

1
fasadin napisał(a):

a po co tak? nie lepiej

for (list<int>::iterator itfor = it; itfor != lista.end() ;)
{
  itfor = lista.erase(itfor);
}

Z kolei Twój kod jest równoważny:

lista.erase(it, lista.end());

(Co jest krótsze w pisaniu i szybsze w wykonywaniu)

0

@msm: nie, nie jest równoważny. Twój usuwa wszystko od it do end, a fasadina usuwa od it co drugi element. - nie zauważyłem braku inkrementacji na końcu for'a
@Henox: błąd jest spowodowany tym, że czasem inkrementujesz it w momencie gdy it == list.end() - dla parzystej wielkości listy tak jest.
Tu masz poprawiony, a raczej załatany Twój kod:

it=lista.begin();
++it; // ustawiam liste na 2 element
while(lista.size()>1) 
{
	if(it != lista.end())
		it = lista.erase(it);

	if(it==lista.end())
	{
		it=lista.begin();
	}
	else
	{
		++it;
	}

}
0

@byku_guzio - nie, nie usuwa. Domyślam się że miał usuwać - żeby tak było, powinno to wyglądać tak:

for (list<int>::iterator itfor = it; itfor != l.end() ; itfor++)
{
  itfor = l.erase(itfor);
}

No i chyba Ci koniec posta ucięło ;]

(edit: ech, powyższy post został edytowany 15 sekund przed tym jak ja wysłałem tego, teraz jest OK)

0

Tu lepiej wyglądający kod:

it = ++lista.begin();
while(lista.size() > 1)
{
	while(it != lista.end())
	{
		it = lista.erase(it);

		if(it != lista.end())
			it++;
	}

	it = lista.begin();
}
0

Tylko to nie jest to o co mi chodzilo. Powyzszy program np dla wartosci 25 dziala tak :
1,3,4,5,6,....,24,25
3,4,5,6,...,24,25
4,5,...,24,25
20,21,22,23,24,25
i az zostanie 25

Mi chodzilo o to zeby to tak dzialalo
1,3,,5,7,9,...
gdy dojdzie do konca to znowu co 2
i tak dlugo az zostanie 1 wartosc czyli 19

Edit : juz sobie poradzilem

1 użytkowników online, w tym zalogowanych: 0, gości: 1