Załóżmy, że jest program z dwiema procedurami, gdzie jedna dopisuje elementy do listy, a druga wyświetla te elementy bez usuwania z listy i jest utrzymywany iterator, żeby za każdym razem nie przechodzić listy od początku. Wykorzystując wektor sprawa jest prosta:
#include <iostream>
#include <vector>
using namespace std;
int BufI;
vector<int> Buf;
void Dopisz(int X)
{
Buf.push_back(X);
if (Buf.size() == 1)
{
cout << "Inicjalizacja iteratora" << endl;
BufI = 0;
}
}
void Wyswietl()
{
while (BufI < Buf.size())
{
cout << Buf[BufI] << endl;
BufI++;
}
}
int main()
{
Dopisz(1);
Dopisz(2);
Dopisz(3);
Wyswietl();
Dopisz(4);
Dopisz(5);
Wyswietl();
return 0;
}
Program wyświetla liczby od 1 do 5 prawidłowo. Teraz identyczny program, w którym zamiast wektora wykorzystuję listę
#include <iostream>
#include <list>
using namespace std;
list<int>::iterator BufI;
list<int> Buf;
void Dopisz(int X)
{
Buf.push_back(X);
if (Buf.size() == 1)
{
cout << "Inicjalizacja iteratora" << endl;
BufI = Buf.begin();
}
}
void Wyswietl()
{
while (BufI != Buf.end())
{
cout << *BufI << endl;
BufI++;
}
}
int main()
{
Dopisz(1);
Dopisz(2);
Dopisz(3);
Wyswietl();
Dopisz(4);
Dopisz(5);
Wyswietl();
return 0;
}
Ten program działa do pierwszego wyświetlenia. Zauważyłem, że jak jest spełniony warunek "BufI == Buf.end()", to po dopisaniu kolejnych elementów, warunek "BufI == Buf.end()" nadal jest spełniony.
Ten program działa poprawnie, czyli w wyświetla liczby od 1 do 5, ale wracanie na początek i odliczanie wyświetlonych elementów przy każdym wywołaniu wyświetlania nie jest rozsądnym podejściem.
#include <iostream>
#include <list>
using namespace std;
int BufI;
list<int> Buf;
void Dopisz(int X)
{
Buf.push_back(X);
if (Buf.size() == 1)
{
cout << "Inicjalizacja iteratora" << endl;
BufI = 0;
}
}
void Wyswietl()
{
list<int>::iterator BufI_;
BufI_ = Buf.begin();
advance(BufI_, BufI);
while (BufI_ != Buf.end())
{
cout << *BufI_ << endl;
BufI_++;
BufI++;
}
}
int main()
{
Dopisz(1);
Dopisz(2);
Dopisz(3);
Wyswietl();
Dopisz(4);
Dopisz(5);
Wyswietl();
return 0;
}
Jak zrealizować powyższy program wykorzystując listę i bez odliczania wszystkich elementów przy każdym wyświetleniu?
Na wyjściu powinien pokazać się taki tekst:
Inicjalizacja iteratora
1
2
3
4
5