• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Funkcja set która zlicza (podobnie jak map)

VPS Starter Arubacloud
0 głosów
179 wizyt
pytanie zadane 13 grudnia 2015 w C i C++ przez Kacper Wysocki Początkujący (340 p.)
Witam,

na wstępie chce podziękować za wyrozumiałość gdyż jest to mój pierwszy post, z góry dziękuje, ale do meritum.

Chciałbym wykożystać funkcje set do policzenia unikalnych kolorów w pewnym obrazku konkretniej w Lenia.ppm ale niestety nie do końca rozumiem jej działanie czy jest ktoś w stanie mi to wytłumaczyć jakoś pomóc ? 

Wstawiam pseudokod tego co już napisałem  że tak powiem konwencjonalnie

int LiczKolory(Obraz& P)
{
    bool unikal=true;
    vector<Color>vektor_copy=P.getVector();
    vector<Color>temp;
    temp.push_back(vektor_copy[0]);
    for(int i=0; i<vektor_copy.size(); i++)
    {
        unikal=true;
        for(int j=0; j<temp.size(); j++)
        {
            if(vektor_copy[i]==temp[j])
            {
                unikal=false;
            }
        }
        if(unikal)
        {
            temp.push_back(vektor_copy[i]);
        }
    }
    return temp.size();
}

 

2 odpowiedzi

+1 głos
odpowiedź 13 grudnia 2015 przez Szykem2 Nałogowiec (29,510 p.)
wybrane 13 grudnia 2015 przez Kacper Wysocki
 
Najlepsza

Funkcję set czy klasę set? Jeżeli funkcję to Ci nie pomoge bo takowej nie znam ale z klasą set jak najbardziej.

Rozumiem, że chcesz zribić dokładnie to samo co z vectorem w wklejonym kodzie tylko efektywniej(bardzo dobry pomysł). Może najpierw trochę info wektor to zwykła realokowana tablica a set(tak samo jak map) jest zaimplementowany najczęściej w postaci drzewa czerwono czarnego(bardzo dobrze zbalansowanego). Więc zminiejszysz złożoność obliczeniową z O(n^2) do O(n logn) co jest dużym przeskokiem. Ale wracając:

#include <set>
//Najpierw tworzysz kontener
set<Color> myset;
//Następnie skoro masz vector to pierwszego fora zostawiamy a drugiego usuwamy. zmienną unikal też.
//set daje metodę find

if(myset.find(vector_copy[i])==myset.end()) { // jeżeli zwrócony iterator do set pokazuje na koniec czyli nie ma elementu o takiej wartości to dodajemy
    myset.insert(vector_copy[i]);
}
//to prawdopodobnie wszystko zostało jeszcze zwrócić rozmiar metodą size()

 

komentarz 13 grudnia 2015 przez Kacper Wysocki Początkujący (340 p.)
edycja 13 grudnia 2015 przez Kacper Wysocki

Czyli cała funkcja ma wyglądać tak ? i czy nie będe musiał jakoś przeciążyć operatorów < == ?:

int LiczKolory(Obraz& P)
{
    set<Color> myset;

    vector<Color>vektor_copy = P.getVector();
    vector<Color>temp;
    temp.push_back(vektor_copy[0]);
    for(int i=0; i<vektor_copy.size(); i++)
    {
        if(myset.find(vektor_copy[i])==myset.end())
        {
            myset.insert(vektor_copy[i]);
        }
    }
    return myset.size();
}

 

komentarz 13 grudnia 2015 przez Szykem2 Nałogowiec (29,510 p.)
edycja 13 grudnia 2015 przez Szykem2

Wygląda w porządku tylko niepotrzebny jest kontener temp. Operatorów nie trzeba przeciążać bo w pętli for porównujesz inty(kompilator może wywalić warning, że porównujesz int z unsigned int ale przeciążać nic nie trzeba) a operator == jest już przeciążony jako składowa iteratora(coś powiedzmy jak wskaźnik) do set.

EDIT: Mój błąd jednak musisz przeciążyć operator < w swojej klasie Color.

//deklaracja metody to drugie const jest konieczne do poprawnego działania, gwarantuje niezmienniczość obiektu
bool operator<(const Color& obj) const;

 

komentarz 13 grudnia 2015 przez Kacper Wysocki Początkujący (340 p.)

napisałem coś takiego:

int LiczKolory(Obraz& P)
{
    set<Color> myset;

    vector<Color>vektor_copy = P.getVector();
    for(int i=0; i < vektor_copy.size(); i++)
    {
        if(myset.find(vektor_copy[i]) == myset.end())
        {
            myset.insert(vektor_copy[i]);
        }
    }
    return myset.size();
};

do tego operator :

bool Color :: operator < (const Color& C) const
{

        return (R < C.R && G < C.G && B < C.B);

}

liczy mi kolory nie powiem ale chyba nie poprawnie ;(

podrzucam rar z całym projektem oraz obrazkiem lena.ppm z tego co wiem kolorów powinno być 255 jeśli jesteś w stanie podpowiedzieć coś co jest nie tak będę mega wdzięczny http://sendfile.es/pokaz/608582---jbna.html

0 głosów
odpowiedź 13 grudnia 2015 przez Kacper Wysocki Początkujący (340 p.)

Udało mi sie po dużych bólach jakoś przeciążyć ten operator a więc jeśli komuś by sie przydało to wrzucam.

bool Color :: operator < (const Color& C) const
{
    if(R < C.R)
    {
        return true;
    }
    else if (R > C.R)
    {
        return false;
    }
    else
    {
        if(G < C.G)
        {
            return true;
        }
        else if(G > C.G)
        {
            return false;
        }
        else
        {
            if (B < C.B)
            {
                return true;
            }
            else if(B > C.B)
            {
                return false;
            }
            else
            {
                return false;
            }
        }
    }
}

I dziękuje Szykem2 za pomoc :)

Podobne pytania

+1 głos
1 odpowiedź 238 wizyt
0 głosów
1 odpowiedź 243 wizyt
0 głosów
1 odpowiedź 93 wizyt
pytanie zadane 14 października 2022 w C i C++ przez pasjonat_algorytmiki Pasjonat (19,540 p.)

92,455 zapytań

141,263 odpowiedzi

319,100 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...