Przeszukiwanie wektora string

0

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

2

Nie wpisałeś nawet w Google cpp find in vector, prawda?

1
vector<string> strings = { "ala", "ma", "kota" };
find(strings.begin(), strings.end(), "ma"); // to zwraca iterator
0

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?

3
if(iter!=wektor.end()) cout<<*iter; else cout<<"Nie znaleziono";
2

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).

0

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 :|

3

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);

http://melpon.org/wandbox/permlink/bsyhzmTHm5RNinNx

2

Wtedy używasz find_if http://www.cplusplus.com/reference/algorithm/find_if/ natomiast dla budowy predykatu używasz string::find

0

Wielkie dzięki, coś spróbuję pokombinować w moim programie :)

0

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?

2

Tak, std::distance lub po prostu odejmij od iteratora vec.cbegin()

2
if(iter!=wektor.end()) cout<<(iter-wektor.begin()); else cout<<"Nie znaleziono";

1 użytkowników online, w tym zalogowanych: 0, gości: 1