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ę?
Edytowanie tablicy
- Rejestracja: dni
- Ostatnio: dni
- Rejestracja: dni
- Ostatnio: dni
A musisz używać tablicy? W tym przypadku idealna byłaby lista.
- Rejestracja: dni
- Ostatnio: dni
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.
- Rejestracja: dni
- Ostatnio: dni
Przecież nie musisz sam implementować listy, użyj biblioteki standardowej: http://www.cplusplus.com/reference/stl/list/
- Rejestracja: dni
- Ostatnio: dni
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ć...
- Rejestracja: dni
- Ostatnio: dni
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...
- Rejestracja: dni
- Ostatnio: dni
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;
}
- Rejestracja: dni
- Ostatnio: dni
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?
- Rejestracja: dni
- Ostatnio: dni
Jeśli chcesz używać operatora[] to użyj na przykład std::deque czy std::vector zamiast std::list.
- Rejestracja: dni
- Ostatnio: dni
A czy ten vector działa tak jak ja chciałem czyli można usunąć jakiś element w środku i luka sama się usunie?
- Rejestracja: dni
- Ostatnio: dni
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/
- Rejestracja: dni
- Ostatnio: dni
- Postów: 152
Możesz szybciej przesuwać dzięki memcpy i memmov. Przyspieszenie kolosalne.
- Rejestracja: dni
- Ostatnio: dni
Albo (w vectorze) swap z ostatnim elementem i pop_back() ;)