Edytowanie tablicy

0

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ę?

0

A musisz używać tablicy? W tym przypadku idealna byłaby lista.

0

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.

0

Przecież nie musisz sam implementować listy, użyj biblioteki standardowej: http://www.cplusplus.com/reference/stl/list/

0

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ć...

0

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...

0
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;
}
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?

0

Jeśli chcesz używać operatora[] to użyj na przykład std::deque czy std::vector zamiast std::list.

0

A czy ten vector działa tak jak ja chciałem czyli można usunąć jakiś element w środku i luka sama się usunie?

0

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/

0

Możesz szybciej przesuwać dzięki memcpy i memmov. Przyspieszenie kolosalne.

0

Albo (w vectorze) swap z ostatnim elementem i pop_back() ;)

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