• 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?

VPS Starter Arubacloud
+1 głos
574 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,020 p.)
1
komentarz 12 czerwca 2019 przez adrian17 Ekspert (349,240 p.)

i nie mogę użyć find_if

(dlaczego?)

2 odpowiedzi

+2 głosów
odpowiedź 12 czerwca 2019 przez adrian17 Ekspert (349,240 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 (156,260 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 (156,260 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 (156,260 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,020 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 (156,260 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 303 wizyt
pytanie zadane 7 października 2016 w C i C++ przez frishu Nowicjusz (120 p.)
–1 głos
3 odpowiedzi 1,402 wizyt
pytanie zadane 31 stycznia 2017 w C i C++ przez Maciek123233 Gaduła (3,400 p.)
0 głosów
1 odpowiedź 142 wizyt
pytanie zadane 19 października 2018 w C i C++ przez MAXIM7 Obywatel (1,990 p.)

92,958 zapytań

141,920 odpowiedzi

321,149 komentarzy

62,291 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.

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...