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

C++ przeszukanie wektora

+1 głos
3,581 wizyt
pytanie zadane 28 września 2016 w C i C++ przez rubiikk Obywatel (1,900 p.)

Siemka, może mi tutaj ktoś na szybko doradzić, jak przeszukać wektor?

std::vector<Patient> patients;
 
//dalszy kod
 
patients.push_back(Patient{id, name, surname, age, phone_number});

Na przykład chciałbym przeszukać wszystkich pacjentów i znaleźć ID 2. Jak to zrobić? Wiem, ze na pewno trzeba będzie użyć pętli, ale... jakaś sugestia, co dalej?

3 odpowiedzi

+1 głos
odpowiedź 28 września 2016 przez obl Maniak (51,300 p.)
wybrane 28 września 2016 przez rubiikk
 
Najlepsza
unsigned int id = 10; // powiedzmy, że to jest id szukanego pacjenta
for( std::vector<Patient>::iterator i = patients.begin(); i < patients.end(); i++){
    if(i->id == id){
        // tutaj wypisujesz dane pacjenta
        break; // zakładam, ze jednemu pacjentowi przypisane jest unikalne id więc kończę pętlę
    }
}

W powyższym kodzie dla uproszczenia założyłem, że pole id klasy Patient jest publiczne.

komentarz 28 września 2016 przez rubiikk Obywatel (1,900 p.)
edycja 28 września 2016 przez rubiikk

Hmm... jednej rzeczy nie rozumiem. Wypisuję sobie dane, no dobra, ale jak wpiszę tam na przykład taką linijkę, to wywala mi błąd:

  std::cout << "Podaj id pacjenta: ";
            int id;
            std::cin >> id;

            for(std::vector<Patient>::iterator i = patients.begin(); i < patients.end(); i++)
                {
                    if(i -> id == id)
                    {
                        std::cout << "   " << id[i] << "      " << name[i] << "      " << surname[i] << "      " << age[i] << "       " << phone_number[i] << "\n";
                     // tutaj wypisujesz dane pacjenta
                    break; // zakładam, ze jednemu pacjentowi przypisane jest unikalne id więc kończę pętlę
                    }
                }

 

2
komentarz 28 września 2016 przez obl Maniak (51,300 p.)

W powyższym kodzie i jest wskaźnikiem na element zawarty w kontenerze typu vector, więc jak chcesz wypisywać to robisz to tak:

unsigned int id = 10; // powiedzmy, że to jest id szukanego pacjenta
for( std::vector<Patient>::iterator i = patients.begin(); i < patients.end(); i++){
    if(i->id == id){
        // tutaj wypisujesz dane pacjenta
        std::cout<<"id pacjenta: "<<i->id<<" imię pacjenta: "<<i->name; 
        break; // zakładam, ze jednemu pacjentowi przypisane jest unikalne id więc kończę pętlę
    }
}

 

komentarz 28 września 2016 przez rubiikk Obywatel (1,900 p.)
edycja 28 września 2016 przez rubiikk

No i fajnie, dziękuję za wyjaśnienie tego. Teraz musiałbym zrobić funkcję zaprzyjaźnioną, bo moje atrybuty są prywatne (id, nazwisko, etc).

Zrobiłem dwie funkcje zaprzyjaźnione:


bool patient_id(const Patient& a)
{
    return a.id;
}
bool patient_name(const Patient& a)
{
    return a.name;
}

Tyle, że... w konsoli wywalił mi błąd:

C:\Users\User\Desktop\Baza danych C++\main.cpp||In function 'bool patient_name(const Patient&)':|
C:\Users\User\Desktop\Baza danych C++\main.cpp|88|error: cannot convert 'const string {aka const std::basic_string<char>}' to 'bool' in return|

 

komentarz 28 września 2016 przez plkpiotr Stary wyjadacz (12,420 p.)
edycja 28 września 2016 przez plkpiotr

Zauważ, że w nagłówku tych funkcji zadeklarowałeś, że zwracaną wartością będzie wartość logiczna bool (true lub false), natomiast w definicji funkcji oczekujesz zwrotu id, które jest liczbą np. int lub innym typem np. string.

Wniosek: Zmień bool w nagłówku na faktyczny typ zmiennej id.

PS. To niekoniecznie muszą być funkcje zaprzyjaźnione (nie widzę pliku nagłówkowego - bo przy deklaracji musiałoby być słówko friend). Tutaj mówisz o tzw. getterach, czyli funkcjach które zwracają np. prywatne pola klas. Istnieją również settery, czyli metody ustawiające prywatne pola klas ;)

+2 głosów
odpowiedź 28 września 2016 przez mariush Dyskutant (7,860 p.)

Prosto i elegancko:

#include <algorithm>
vector<Patient>::iterator it = find_if(pacjenci.begin(), pacjenci.end(), [](Patient p){ return p.id == 2; });

 

0 głosów
odpowiedź 28 września 2016 przez rubiikk Obywatel (1,900 p.)

Dlaczego w tym kodzie:

unsigned int id = 10; // powiedzmy, że to jest id szukanego pacjenta
for( std::vector<Patient>::iterator i = patients.begin(); i < patients.end(); i++){
    if(i->id == id){
        // tutaj wypisujesz dane pacjenta
        std::cout<<"id pacjenta: "<<i->id<<" imię pacjenta: "<<i->name; 
        break; // zakładam, ze jednemu pacjentowi przypisane jest unikalne id więc kończę pętlę
    }
}

Wyszukuje mi tylko i wyłącznie osobę /rekord na pierwszej pozycji w wektorze, a nie przeszukuje całego wektora? Na przykład jak próbuję znaleźć osobę w środku lub na końcu, to wywala mi błąd, zamiast wskazać poprawny wpis.

komentarz 28 września 2016 przez draghan VIP (106,230 p.)

Ten kod jest w porządku. Jaki błąd Ci "wywala"?

Na marginesie, ten kod mógłby być odrobinę bardziej przejrzysty:

for(const auto &patient : patients){
    if(patient.id == id){
        // tutaj wypisujesz dane pacjenta
        std::cout<<"id pacjenta: "<<patient.id<<" imię pacjenta: "<<patient.name; 
        break; // zakładam, ze jednemu pacjentowi przypisane jest unikalne id więc kończę pętlę
    }
}

 

komentarz 28 września 2016 przez rubiikk Obywatel (1,900 p.)
Znaczy, po prostu... Wyszukuje mi za każdym razem tylko i wyłącznie dane, które znajdują się przy pierwszym pacjencie. Jeżeli chcę wyszukać ID/Imię u osób, które znajdują się w wektorze na kolejnych pozycjach, to po prostu nic mi nie znajduje.
komentarz 28 września 2016 przez draghan VIP (106,230 p.)
Ten kod jest poprawny. Sprawdź, czy Twój wektor rzeczywiście zawiera elementy, których się tam spodziewasz, np. wypisz je sobie przed wyszukaniem.
komentarz 28 września 2016 przez rubiikk Obywatel (1,900 p.)
Hmm... na pewno zawiera.

http://imgur.com/a/vJfUf
komentarz 28 września 2016 przez draghan VIP (106,230 p.)
To pokaż jeszcze kontekst, czyli kod za to odpowiedzialny.

Podobne pytania

0 głosów
2 odpowiedzi 757 wizyt
pytanie zadane 21 października 2015 w C i C++ przez szmq Pasjonat (22,770 p.)
0 głosów
4 odpowiedzi 815 wizyt
0 głosów
1 odpowiedź 388 wizyt

93,776 zapytań

142,736 odpowiedzi

323,388 komentarzy

63,381 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...