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
Nie wpisałeś nawet w Google cpp find in vector
, prawda?
vector<string> strings = { "ala", "ma", "kota" };
find(strings.begin(), strings.end(), "ma"); // to zwraca iterator
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?
if(iter!=wektor.end()) cout<<*iter; else cout<<"Nie znaleziono";
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
).
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 :|
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);
Wtedy używasz find_if
http://www.cplusplus.com/reference/algorithm/find_if/ natomiast dla budowy predykatu używasz string::find
Wielkie dzięki, coś spróbuję pokombinować w moim programie :)
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?
Tak, std::distance
lub po prostu odejmij od iteratora vec.cbegin()
if(iter!=wektor.end()) cout<<(iter-wektor.begin()); else cout<<"Nie znaleziono";