//--------------------------------------------------------------------------- // sanat.cpp // Lasketaan standardisyötöstä tulevat sanat // Esimerkki filtteristä (lukee stdin ja tulostaa stdout) // Esimerkki STL:n tietorakenteesta (map) // Vesa Lappalainen 12.3.2000 //---------------------------------------------------------------------------- #include #include using namespace std; #include //------------------------------------------------------------------------------ string erota(string &jono, const string &merkit,bool etsi_takaperin=false) // Erottaa jonosta valittujen merkkien kohdalta alkuosan ja loppuosan. // Alkuosa palautetaan funktion nimessä ja loppuosa jätetään // jonoon. Merkin etsimissuunta voidana valita (oletuksena alusta päin). // Jos merkkiä ei löydy, palautetaan koko jono ja tyhjennetään jono. // Käyttöesimerkki: olkoon aluksi string jono,s; // 1) jono = "123 456"; s = erota(jono," "); => jono == "456" s == "123" // 2) jono = "123"; s = erota(jono,";"); => jono == "" s == "123" // 3) jono = "1;2 3"; s = erota(jono," ;"); => jono == "2 3" s == "1" // { size_t p; if ( !etsi_takaperin ) p = jono.find_first_of(merkit); else p = jono.find_last_of(merkit); string alku = jono.substr(0,p); if ( p == string::npos ) jono = ""; else jono.erase(0,p+1); return alku; } class cSanat { std::map > sanat; public: void tulosta(ostream &os) const; void laske(istream &is); void lisaa(string &rivi); }; void cSanat::tulosta(ostream &os) const { std::map >::const_iterator i; for (i=sanat.begin(); i!=sanat.end(); i++) os << i->first << " = " << i->second << "\n"; } void cSanat::lisaa(string &rivi) { string s; while ( rivi != "" ) { s = erota(rivi," ()<>[]{},;:+-/*!\"'?.%=:"); if ( s == "" ) continue; sanat[s]++; } } void cSanat::laske(istream &is) { string rivi; while ( getline(is,rivi) ) lisaa(rivi); } int main(void) { cSanat sanat; sanat.laske(cin); sanat.tulosta(cout); return 0; }