Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Wyszukiwanie tekstu w multimapie

Ostatnio zmodyfikowano 2021-03-30 05:47
Autor Wiadomość
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..

C/C++
#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()
{
   
//ctor
}

Book::~Book()
{
   
//dtor
}

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;
}
P-178363
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.
P-178366
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!
P-178368
DejaVu
» 2021-03-29 22:44:45
C/C++
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.
P-178369
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.
P-178370
« 1 »
  Strona 1 z 1