Witam!
Mam taki problem: mam dość dużą tablicę, załóżmy, że jest to jednowymiarowa tablica o 100 elementach. W czasie działania programu mają znikać jej pewne elementy np. element 59. Wtedy ja przesuwam resztę elementów od 60 do 100 o jedną pozycję w lewo i przeglądam tablicę po prostu do 99 elementu. Jeśli ma wypaść z tablicy jeszcze jakiś element to robię tak samo. Problem w tym, że takie przepisywanie wielokrotne w ciągu ciągu działania programu przepisywanie dużo kosztuje. Mam więc pytanie czy nie istnieje jakiś inny sposób, jakieś polecenie usuwające np. element właśnie 59 i zmniejszający tablicę?
A musisz używać tablicy? W tym przypadku idealna byłaby lista.
Z tablicą było by mi łatwiej bo ma to być tablica stosów... lista stosów jakoś mi nie wychodzi jest trudniejsza do implementacji, łatwiej się porównuje elementy tablicy niż listy.
Przecież nie musisz sam implementować listy, użyj biblioteki standardowej: http://www.cplusplus.com/reference/stl/list/
Tak ale ja wykonałem zadanie robiąc tablicę stosów, których elementy to stringi... ciężko jest coś takiego zrobić na liście zamiast tablicy. Najgorzej sprawa wygląda z porównywaniem gdy miałem tablice to np. tab[2].top()==tab[10].top(); a przy liście trzeba jakoś ze wskaźnikiem się bawić nie wiem nawet jak by to miało wyglądać...
Dobrze nie widząc innego rozwiązania załóżmy, że podejmę się tego "lista stosów". W tym celu robię takie coś:
typedef stack<string> stos;
list<stos> lista;
string dane;
stack<string> stosik;
Tak wygląda moja lista stosów. Wczytuje do zmiennej "dane" np. aaa.
cin>>dane;
lista.push_back(stosik.push(dane));
Ale takie coś nie działa... działa gdy najpierw wczytam dane na stos a potem stos na listę. Robię więc tak:
cin>>dane;
stsosik.push(dane);
lista.push_back(stosik);
Takie coś już działa ale dlaczego nie działa ta pierwsza wersja? Była ładniejsza...
OK ale jak teraz np. Wyświetlić te dane (tu pojawiają się wskaźniki):. Mam taki kod:
for(list<stos>::iterator it=pack.begin();it!=pack.end();it++)
cout<<*it<<" ";
Kod ten jednak nie działa. Jak wyświetlić taką strukturę? Chodzi mi oczywiście by wyświetlić .top() stosu każdego elementu listy...
lista.push_back(stosik.push(dane));
Nie zadziała bo push zwraca void. http://www.cplusplus.com/reference/stl/stack/push/
#include <iostream>
#include <sstream>
#include <string>
#include <stack>
#include <list>
int main() {
using namespace std;
list<stack<string> > lista;
stringstream ss("pierwszy drugi trzeci czwarty");
string slowo;
while (ss >> slowo) {
stack<string> stos;
stos.push(slowo);
lista.push_back(stos);
}
for (list<stack<string> >::const_iterator i = lista.begin();
i != lista.end(); ++i) {
cout << i->top() << "\n";
}
return 0;
}
Ok dzięki ten fragment już działa, ale jak teraz np. porównywać elementy? np. if(top ze stosu 4 elementu na liście==top ze stosu 5 elementu na liście) to coś tam?
Jeśli chcesz używać operatora[] to użyj na przykład std::deque czy std::vector zamiast std::list.
A czy ten vector działa tak jak ja chciałem czyli można usunąć jakiś element w środku i luka sama się usunie?
Tak, ale każdy element za nim będzie musiał być przesunięty, co może być kosztowne. W takim przypadku lepiej użyć listy. http://www.cplusplus.com/reference/stl/list/
Poczytaj sobie o kontenerach i sam zdecyduj, który jest Ci potrzebny. http://www.cplusplus.com/reference/stl/
Możesz szybciej przesuwać dzięki memcpy i memmov. Przyspieszenie kolosalne.
Albo (w vectorze) swap
z ostatnim elementem i pop_back()
;)