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

C++ jak find() z biblioteki algorithm porównuje elementy?

Object Storage Arubacloud
+1 głos
528 wizyt
pytanie zadane 12 czerwca 2019 w C i C++ przez k222 Nałogowiec (30,150 p.)
Cześć, nie mogę nigdzie tego znaleźć, a potrzebuję do zadania (i trochę z ciekawości) - jak funkcja find() z biblioteki algorithm porównuje elementy? Czy da się jakoś "ustawić"sposób porównywania przez np. przeciążenie jakiegoś operatora w klasie?  (potrzebuję znaleźć obiekt w kolekcji vector, który ma jedną konkretną zmienną ustawioną na daną wartość i nie mogę użyć find_if)
komentarz 12 czerwca 2019 przez tkz Nałogowiec (42,000 p.)
1
komentarz 12 czerwca 2019 przez adrian17 Ekspert (344,860 p.)

i nie mogę użyć find_if

(dlaczego?)

2 odpowiedzi

+2 głosów
odpowiedź 12 czerwca 2019 przez adrian17 Ekspert (344,860 p.)
wybrane 12 czerwca 2019 przez k222
 
Najlepsza

Jeszcze dla formalności odpowiedź słowna:

jak funkcja find() z biblioteki algorithm porównuje elementy

Uzywając operatora ==.

+1 głos
odpowiedź 12 czerwca 2019 przez mokrowski Mędrzec (155,460 p.)
#include <iostream>
#include <vector>
#include <algorithm>

struct X {
    explicit X(int val) : val{val} {}
    bool operator == (const X&) const = delete;
private:
    int val;
};

struct Y {
    explicit Y(int val) : val{val} {}
    bool operator == (const Y& src) const {
        return this->val == src.val;
    }
private:
    int val;
};

int main() {
    X x1(5);
    Y y1(12);
    Y y2(19);
    std::vector<X> vecX{x1, x1, x1};
    std::vector<Y> vecY{y1, y2, Y(123)};
    auto it1 = std::find(vecY.cbegin(), vecY.cend(), y2);
    if(it1 != vecY.cend()) {
        std::cout << "Znaleziono element typu Y na pozycji " << std::distance(vecY.cbegin(), it1) << '\n';
    } else {
        std::cout << "Nie znaleziono elementu typu Y.\n";
    }

    // To Ci się nie skompiluje bo brak operatora równości dla klasy Y (operator == (...) )
    //auto it2 = std::find(vecX.cbegin(), vecX.cend(), x1);

}

 

komentarz 12 czerwca 2019 przez Milesq Nałogowiec (32,020 p.)
std::vector<X> vecX{x1, x1, x1};

co oznacza wywoływanie konstruktora z '{'?

komentarz 12 czerwca 2019 przez mokrowski Mędrzec (155,460 p.)
Konstruuje wektor z elementami wymienionymi w nawiasach { }.
komentarz 12 czerwca 2019 przez Milesq Nałogowiec (32,020 p.)

ale jaka jest różnica między tym a:

vector<int> myVec = {1, 2, 3};

 

komentarz 13 czerwca 2019 przez mokrowski Mędrzec (155,460 p.)
Na poziomie osoby początkującej, jsą to równorzędne sposoby. Jak nauczysz się do czego służy std::initializer_list oraz jak działają konwersje w trakcie uruchamiania konstruktora, to kilka subtelności się pojawi.
komentarz 14 czerwca 2019 przez tkz Nałogowiec (42,000 p.)
Tak szukam na czym polega różnica i nic nie mogę znaleźć. Wytłumaczysz, albo chociaż linka podasz?
komentarz 14 czerwca 2019 przez mokrowski Mędrzec (155,460 p.)

To może zacznę od linka: https://en.cppreference.com/w/cpp/utility/initializer_list

Sprawdź jak działa ten typ danych i odpowiedz sobie na pytanie czy 1 argument może/powinien/będzie przesyłany jako std::initializer_list oraz co stanie się jeśli będziesz miał konstruktor kopiujący oraz operator przypisania. Co się też stanie (tj. jakie sposoby konstrukcji) będą dopuszczalne jeśli nie będzie operatora przypisania oraz konstruktora kopiującego.

Podobne pytania

0 głosów
0 odpowiedzi 238 wizyt
pytanie zadane 7 października 2016 w C i C++ przez frishu Nowicjusz (120 p.)
–1 głos
3 odpowiedzi 1,314 wizyt
pytanie zadane 31 stycznia 2017 w C i C++ przez Maciek123233 Gaduła (3,400 p.)
0 głosów
1 odpowiedź 135 wizyt
pytanie zadane 19 października 2018 w C i C++ przez MAXIM7 Obywatel (1,990 p.)

92,579 zapytań

141,432 odpowiedzi

319,657 komentarzy

61,963 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...