C++ Usuwanie ze struktury .erase()

0

Witam mam prostą strukture danych i w niej dane

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?

0

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

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/

#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;
}

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.

1

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

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.

1

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

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