C++ Usuwanie ze struktury .erase()

C++ Usuwanie ze struktury .erase()
TA
  • Rejestracja:około 6 lat
  • Ostatnio:ponad 4 lata
  • Postów:37
0

Witam mam prostą strukture danych i w niej dane

Kopiuj
struct jeden_dane{
int ID,a,b,c
}
vector <jeden_dane> jeden

W jaki sposób usunąć dane za pomocą .erase()? Próbowałem wielu wariantów i nic nie wyszło, poszukałem informacji że należy w strukturze stworzyć jakiś operator ale jestem w tym temacie zielony. Ma ktoś link do strony gdzie tego typu rzeczy są dobrze wytłumaczone?

edytowany 2x, ostatnio: TenAnonim
szweszwe
  • Rejestracja:ponad 11 lat
  • Ostatnio:5 dni
  • Lokalizacja:Kraków
  • Postów:1694
1
TA
A wykasowanie pojedynczej pozycji? Np tylko c?
szweszwe
Odpowiadaj raczej w postach jak masz takie duże pytania. Odpowiedź na pytanie: tak to sobie musisz kasować z poziomu elementu struktury a nie vectora. erase usuwa Ci cały element, jak chcesz zmienić wartość tego inta to po prostu weź ten element z vectora i go zmień.
lion137
  • Rejestracja:około 8 lat
  • Ostatnio:około 6 godzin
  • Postów:4928
0

Z czym Masz dokładnie problem. Pokaż co Robisz.


TA
Problem chyba rozwiązałem, wrzucę później do oceny przez tych którzy znają się lepiej. Dziękuję za chęci
TA
  • Rejestracja:około 6 lat
  • Ostatnio:ponad 4 lata
  • Postów:37
0
lion137 napisał(a):

Z czym Masz dokładnie problem. Pokaż co Robisz.

Skończone, jeżeli masz czas i ochotę chciałbym prosić Ciebie o ocenienie i powiedzenie co jest źle bo mi SPOJ tego nie przyjmuje... Cały czas "Przekroczenie limitu czasu" który wynosi 5s... Na komputerze robi mi się to w ułamki sekund jak dam zadeklarowane dane.

Zapomniałem link do zadania https://pl.spoj.com/problems/TRNGLFLD/

Kopiuj
#include <iostream>
#include <vector>

using namespace std;

//Struktura danych i operatory
struct dane_wspolrzedne
{
    int pkt_id,x,y;
};
vector <dane_wspolrzedne> v_wspol;

//Szukanie Xmin,Xmax,Ymin,Ymax
void szukanie(int a)
{
    int Xmax=v_wspol[0].x;
    int Xmin=v_wspol[0].x;
    int Ymax=v_wspol[0].y;
    int Ymin=v_wspol[0].y;
    for(int i=0; i<a; i++){
        if(Xmax<v_wspol[i].x){
            Xmax=v_wspol[i].x;
        }

        if(Xmin>v_wspol[i].x){
            Xmin=v_wspol[i].x;
        }

        if(Ymax<v_wspol[i].y){
            Ymax=v_wspol[i].y;
        }

        if(Ymin>v_wspol[i].y){
            Ymin=v_wspol[i].y;
        }
    }

    //Sprawdzanie ktore punkty sa wysuniete
    int z=0,punkty[3]={0,0,0};
    for(int i=0; z<3; i++)
    {
        if((v_wspol[i].x==Xmax)||(v_wspol[i].x==Xmin)||(v_wspol[i].y==Ymax)||(v_wspol[i].y==Ymin))
        {
            punkty[z]=v_wspol[i].pkt_id;
            z++;
            v_wspol.erase(v_wspol.begin()+i);
            i--;
        }
    }
    for(int i=0; i<3; i++)
    {
        cout<<punkty[i]<<"   ";
    }
    //Deklaracja rekurencyjnosci
    int b=a-3;
    if(b>2)
    {
        cout<<endl;
        cout<<endl;
        szukanie(b);
    }
}

//Wprowadzanie danych
void wprowadzanie()
{
    dane_wspolrzedne w;
    int punkty;
    cin>>punkty;
    if((punkty%3)==0)
    {
        for(int i=0; i<punkty; i++)
        {
            w.pkt_id=i+1;
            cin>>w.x>>w.y;
            v_wspol.push_back(w);
        }
    }
    else
    {
        cout<<"Trójkat nie moze miec innej liczby wierzcholków niz 3:)"<<endl;
        wprowadzanie();
    }
    szukanie(punkty);
}

int main()
{
    int proby;
    cin>>proby;
    while(proby!=0)
    {
        wprowadzanie();
        proby--;
    }
    return 0;
}

edytowany 5x, ostatnio: TenAnonim
szweszwe
Daj jeszcze link do treści zadania.
TA
Wiem zapomniałem, przepraszam za to.
TomaszLiMoon
  • Rejestracja:prawie 10 lat
  • Ostatnio:około 11 godzin
  • Postów:530
1

Wydaje mi się użycie kontenera vector zawyża tutaj czas obliczeń. A dokładnie usuwanie elementów ze swoją złożonością O(n).
Drugą sprawą może być szukanie elementów najmniejszych i największych, które dla np. 19998 punktów jest realizowane **6666 ** razy.
Ja poszedł bym tutaj w jakiś algorytm wykorzystujący posortowane dane.

edytowany 2x, ostatnio: TomaszLiMoon
TA
Myślałem o sortowaniu jednak można tylko posegregować na osi X lub Y. Segregując obydwie osi pkt_ID zmieniłoby się a tego muszę uniknąć. Chyba że przekopiowanie i posortowanie kopii, A usuwanie elementów nie wiem jak inaczej rozwiązać. Oczywiście mógłbym tego nie robić jednak wtedy będzie cały czas X/y,max/min takie samo a musi się zmieniać zgodnie z treścią zadania.
TomaszLiMoon
  • Rejestracja:prawie 10 lat
  • Ostatnio:około 11 godzin
  • Postów:530
1

Możesz utworzyć dwie listy - osobno dla wartości x i osobno dla wartości y np:

Kopiuj
struct point
{
   int value;
   int id;
};

std::list<point> listX;
std::list<point> listY;

Następnie posortować i teraz możesz usuwać elementy, które teraz najczęściej będą usuwane z początku lub końca listy.
Można to jeszcze bardziej zoptymalizować używając iteratora std::list<point>::iterator dodanego do point i wskazującego na odpowiedniego sąsiada w drugiej liście.
Zmniejszy to jeszcze bardziej narzut czasowy w przypadku, kiedy zajdzie konieczność usunięcia elementów znajdujących się w środku listy.

TA
Ale jak mam koordynaty posegregowac jednoczesnie? To jest absuardalne poniewaz albo zrobie to po osi X albo po osi Y. Zupelnie nie rozumiem.
TomaszLiMoon
  • Rejestracja:prawie 10 lat
  • Ostatnio:około 11 godzin
  • Postów:530
1

Tutaj masz przykład jak to zrobić https://wandbox.org/permlink/md1ARcfhpatXppAr

TA
Zaawansowany poziom programowania jak dla mnie, muszę podzielić to na etapy i to ogarnąć. Dziękuję za pomoc i za wskazanie drogi.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.