Witam, jak najprościej dokonać wyszukiwania słowa / słów zapisanych do zmiennej string ( podawanych przez użytkownika ) w wektorze string - zadeklarowanym wcześniej? Proszę o pomoc i jak zwykle pozdrawiam forumowiczów
Przeszukiwanie wektora string
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Wrocław
- Postów: 13042
Nie wpisałeś nawet w Google cpp find in vector, prawda?
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Wrocław
- Postów: 404
vector<string> strings = { "ala", "ma", "kota" };
find(strings.begin(), strings.end(), "ma"); // to zwraca iterator
- Rejestracja: dni
- Ostatnio: dni
- Postów: 42
Tak, zgadza się, ale gdy właśnie próbuję w taki sposób program mi się wysypuje. Jakby co mój wektor w którym poszukujemy zawiera dwa słowa w każdej komórce.
vector<std::string> wektor; ( tutaj już znajdują się dane , na przykład wektor[0] - czarny kot , wektor[1] - maly pies... )
vector<std::string>::iterator iter;
string szukany;
std::cout<<"Podaj jakiego pacjenta chcesz znalezc?";
std::cin>>szukany;
iter=find(waktor.begin(), wektor.end(), szukany);
cout<<*iter;
Spodziewam się wypisania szukanego elementu jeżeli zostanie dobrze wpisany poszukiwany element. Tak się jednak nie dzieje, co nie gra?
- Rejestracja: dni
- Ostatnio: dni
if(iter!=wektor.end()) cout<<*iter; else cout<<"Nie znaleziono";
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Szczecin
Nie sprawdzasz czy cokolwiek znalazło. W tym przypadku to UB. Poza tym, kłaniają się podstawy. cin >> szukany wczyta słowo, a nie całą linię (czyli jak wstukasz czarny kot to szukany będzie zawierał czarny).
- Rejestracja: dni
- Ostatnio: dni
- Postów: 42
Tak, nie myślę już całkowicie, można było getline(cin,szukany); .. Teraz oczywiście działa.
A gdybym chciał spróbować zrobić, aby po wpisaniu 'czarny' odnalazło mi 'czarny kot' ?
Niby pytałem wykładowcy, ale nie dostałem zrozumiałej odpowiedzi :|
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Szczecin
std::find_if i podajesz predykat.
edit:
wersja z szukaniem gdziekolwiek w stringu i na początku stringa:
vector<string> data = {
"czarny kot",
"maly pies",
"zielona kielbaska"
};
string szukany = "kot";
auto it = find_if(data.cbegin(), data.cend(), [&](string const& s){
return s.find(szukany) != string::npos;
});
DBG(it == data.cend() ? ">pusto<" : *it);
szukany = "kot";
it = find_if(data.cbegin(), data.cend(), [&](string const& s){
return s.find(szukany) == 0;
});
DBG(it == data.cend() ? ">pusto<" : *it);
- Rejestracja: dni
- Ostatnio: dni
Wtedy używasz find_if http://www.cplusplus.com/reference/algorithm/find_if/ natomiast dla budowy predykatu używasz string::find
- Rejestracja: dni
- Ostatnio: dni
- Postów: 42
Wielkie dzięki, coś spróbuję pokombinować w moim programie :)
- Rejestracja: dni
- Ostatnio: dni
- Postów: 42
Aha, jeszcze jedno pytanie. Czy mogę w jakiś sposób określić na który element wektora wskazuje iterator? Prościej pisząc - czy da się na podstawie iteratora uzyskać liczbę całkowitą będącą numerem aktualnie wskazanego elementu?
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Szczecin
Tak, std::distance lub po prostu odejmij od iteratora vec.cbegin()
- Rejestracja: dni
- Ostatnio: dni
if(iter!=wektor.end()) cout<<(iter-wektor.begin()); else cout<<"Nie znaleziono";