Wyszukiwanie tekstu w multimapie
Ostatnio zmodyfikowano 2021-03-30 05:47
wojownik266 Temat założony przez niniejszego użytkownika |
Wyszukiwanie tekstu w multimapie » 2021-03-29 18:14:13 Nie będę się zbytnio rozpisywał i powiem krótko… Czy ktoś mógłby mi pomóc w napisaniu funkcj, kodu wyszukujacego zadany tekst w multimapie? Poniżej moje dokonania w tej materii. Poniższy program jest tylko fragmentem większego projektu który sobie wymyśliłem tak po roku abstynencji od kodowania.. #include <iostream> #include <cstring> #include <fstream> #include <map> #include <algorithm> using namespace std;
class Book { public: Book(); virtual ~Book(); void wczytaj(); void szukaj(); bool func( string c ); protected: private: std::string autor; std::string tytul; std::string plik_autor, plik_tytul; ofstream out, aut; ifstream aplik, tplik; multimap < string, string > bok; multimap < string, string >::iterator it; }; Book::Book() { }
Book::~Book() { }
void Book::wczytaj() { cout << "DODAWANIE KSIAZEK DO BIBLIOTEKI" << endl; cout << "_______________________________" << endl; out.open( "autor.txt", ios::out | ios::app ); aut.open( "tytul.txt", ios::out | ios::app ); int ile = 0; cout << "Ile pozycji dodac?:"; cin >> ile; for( int i = 0; i < ile; ++i ) { cin.ignore(); cin.clear(); cout << "[" << i + 1 << "] " << "Podaj autora ksiazki:"; getline( cin, autor ); cout << "Podano autora: " << autor << endl; out << autor << endl; cout << "[" << i + 1 << "] " << "Podaj tytul ksiazki:"; getline( cin, tytul ); cout << "Podano tytul: " << tytul << endl; aut << tytul << endl; } out.close(); aut.close(); } void Book::szukaj() { cout << "WYSZUKIWANIE" << endl; cout << "____________" << endl; aplik.open( "autor.txt", ios::in ); tplik.open( "tytul.txt", ios::in ); while( getline( aplik, plik_autor ) ) { while( getline( tplik, plik_tytul ) ) { bok.insert( make_pair( plik_autor, plik_tytul ) ); } cout << "Podaj autora szukanej ksiazki:"; getline( cin, autor ); cin.ignore(); it = find_if( bok.begin(), bok.end(), func ); cout << it->second << endl; } aplik.close(); tplik.close(); } bool Book::func( string c ) { return c ==( autor ); } int main() { Book bo; bo.wczytaj(); cout << "Funkcja wyszukiwanie w multimapie" << endl; bo.szukaj(); cin.get(); return 0; }
|
|
DejaVu |
» 2021-03-29 19:54:21 Jaki cel chcesz osiągnąć? Wyszukiwać fragmenty tekstów ze środka tytułów? Bo jeżeli tak to musisz przeszukiwać cały kontener, więc... równie dobrze możesz wszystkie tytuły/dane książek trzymać w std::vector. |
|
wojownik266 Temat założony przez niniejszego użytkownika |
» 2021-03-29 20:08:16 Chciałbym aby po wpisaniu imienia i nazwiska funkcja zwracała wszystkie wystąpienia tego imienia i nazwiska oraz tytuły książek tych autorów. Próbowałem z algorytmem find ale ten wyszukuje tylko pierwsze wystąpienie szukanego klucza. Trochę niezbyt jasno to napisałem ale myślę że da się zrozumieć. Miłego wieczoru! |
|
DejaVu |
» 2021-03-29 22:44:45 std::string findAuthorName = "abc"; std::string findAuthorSurname = "def"; for( const auto & book: books ) { if( book.authorName.find( findAuthorName ) == std::string::npos || book.authorSurname.find( findAuthorSurname ) == std::string::npos ) continue; cout << book.autorName << " " << book.authorSurname << " " << book.title << endl; }
Innymi słowy: zaczynaj od rozwiązań prostych, a nie optymalnych. Zamiast wypisywania możesz wrzucać wyniki do std::vector i potem sobie je przetwarzać jak Ci wygodniej. |
|
wojownik266 Temat założony przez niniejszego użytkownika |
» 2021-03-30 05:47:37 Zrobię chyba tak jak podpowiadasz i poćwiczę jeszcze wektory bo... ten kod który podałeś jest jeszcze dla mnie trochę zbyt trudny. Dziękuję za odpowiedź i Życzę miłego dnia. |
|
« 1 » |