Problem z set<para> - powtarzające się elementy

0

Witam, mam problem z set z stl, mianowicie chcę do set dodawać struktury 2 elementowe lub pary, problem w tym, że potrzebuje też niektóre pary usuwać i nie wiem jak użyć do tego funkcji erase by to usuwanie skutecznie zadziałało. Przykładowo mam taki kod:

 
#include <set>
#include <cstdio>

struct para {
    int poczatek;
    int koniec;
};

struct comp {
    inline bool operator()(const para& a,const para& b) {
        if (a.poczatek == b.poczatek) return a.koniec <= b.koniec;
        return a.poczatek < b.poczatek;
    }
};

int main() {

    std::set<para,comp> S;
    std::set<para>::iterator it;
    para P;
    P.poczatek = 10;
    P.koniec = 15;
    S.insert(P);
    P.poczatek = 12;
    P.koniec = 17;
    S.insert(P);
    P.poczatek = 60;
    P.koniec = 25;
    S.insert(P);
    //? 

W jaki sposób usunąć konkretną strukture np o wartości 12 17 nie przeglądając iteratorem całego słownika?

1

S.erase(P)

0

Tylko jest mały problem, gdy w przeciążeniu operatora dam a.koniec <= b.koniec to erase nie chce działać, a zmiana na a.koniec < b.koniec powoduje, że działa, tylko wtedy nie da się zapisać do zbioru 2 razy takiej samej pary, a potrzebuje mieć możliwość zapisywania pary o wartościach takich samych, jakie występują już w słowniku

1

Bo o to w tym kontenerze chodzi! Jeżeli chcesz, żeby wartości się powtarzały użyj std::multiset.

1

użyj multiset.

0

Fakt, to jest na strukturze drzewa, wielkie dzięki

0

Mam jeszcze jedno drobne pytanie, jak użyć funkcji upper_bound jeśli w set posiadam struktury?

0

Do upper_bound też przekazujesz struktury. Ale nie potrzebujesz tego upper_bound. Posortowane ma być wg górnej granicy, zaś usuwać musisz niestety wg dolnej ;)

0

Potrzebuje znaleźć wśród takich par konkretną parę, na początek zaimplementowałem to w ten sposób:

it = S.begin();
while (it != S.end()) {
...

Problem polega na tym, że czasowo nie jest optymalne, potrzebuje jakoś przeskoczyć pewien przedział niepotrzebnych par ;)

0

Nie możesz ich przeskoczyć bo nie są po kolei.

0
Alikey napisał(a):

Potrzebuje znaleźć wśród takich par konkretną parę, na początek zaimplementowałem to w ten sposób:

it = S.begin();
while (it != S.end()) {
...

Problem polega na tym, że czasowo nie jest optymalne, potrzebuje jakoś przeskoczyć pewien przedział niepotrzebnych par ;)

Zamiast ręcznie szukać wykorzystaj metodę którą posiada std::set i std::multiset czyli find. Twoje przeszukanie ma złożoność liniową, a find logarytmiczną.
http://www.cplusplus.com/reference/set/multiset/find/

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.