#include <algorithm>
#include <iostream>
#include <iterator>
#include <map>
#include <sstream>
struct Counter
{
std:: map < std:: string , int > wordCount;
void operator( ) ( const std:: string & item) { ++ wordCount[ item] ; }
operator std:: map < std:: string , int > ( ) { return wordCount; }
} ;
int main( )
{
std:: string input =
"Relations between data in the STL are represented with maps."
"A map is a directed relation, by using it you are representing "
"a mapping. In this directed relation, the first type is related to "
"the second type but it is not true that the inverse relationship "
"holds. This is useful in a lot of situations, but there are some "
"relationships that are bidirectional by nature." ;
std:: istringstream instream ( input) ;
std:: istream_iterator < std:: string > start( instream) ;
std:: istream_iterator < std:: string > end;
std:: map < std:: string , int > wordCount = std:: for_each ( start, end, Counter( ) ) ;
for ( std:: map < std:: string , int > :: iterator it = wordCount.begin ( ) ; it ! = wordCount.end ( ) ; ++ it)
{
std:: cout << it- > first << " : " << it- > second << std:: endl ;
}
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aXRlcmF0b3I+CiNpbmNsdWRlIDxtYXA+CiNpbmNsdWRlIDxzc3RyZWFtPgoKc3RydWN0IENvdW50ZXIKewogICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gd29yZENvdW50OwogICAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IHN0ZDo6c3RyaW5nICYgaXRlbSkgeyArK3dvcmRDb3VudFtpdGVtXTsgfQogICAgb3BlcmF0b3Igc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4oKSB7IHJldHVybiB3b3JkQ291bnQ7IH0KfTsKCgppbnQgbWFpbigpCnsKICAgIHN0ZDo6c3RyaW5nIGlucHV0ID0KICAgICAgICAiUmVsYXRpb25zIGJldHdlZW4gZGF0YSBpbiB0aGUgU1RMIGFyZSByZXByZXNlbnRlZCB3aXRoIG1hcHMuIgogICAgICAgICJBIG1hcCBpcyBhIGRpcmVjdGVkIHJlbGF0aW9uLCBieSB1c2luZyBpdCB5b3UgYXJlIHJlcHJlc2VudGluZyAiCiAgICAgICAgImEgbWFwcGluZy4gSW4gdGhpcyBkaXJlY3RlZCByZWxhdGlvbiwgdGhlIGZpcnN0IHR5cGUgaXMgcmVsYXRlZCB0byAiCiAgICAgICAgInRoZSBzZWNvbmQgdHlwZSBidXQgaXQgaXMgbm90IHRydWUgdGhhdCB0aGUgaW52ZXJzZSByZWxhdGlvbnNoaXAgIgogICAgICAgICJob2xkcy4gVGhpcyBpcyB1c2VmdWwgaW4gYSBsb3Qgb2Ygc2l0dWF0aW9ucywgYnV0IHRoZXJlIGFyZSBzb21lICIKICAgICAgICAicmVsYXRpb25zaGlwcyB0aGF0IGFyZSBiaWRpcmVjdGlvbmFsIGJ5IG5hdHVyZS4iOwogICAgICAgIAogICAgIHN0ZDo6aXN0cmluZ3N0cmVhbSBpbnN0cmVhbSAoaW5wdXQpOwogICAgICAgIAogICAgIHN0ZDo6aXN0cmVhbV9pdGVyYXRvcjxzdGQ6OnN0cmluZz4gc3RhcnQoaW5zdHJlYW0pOwogICAgIHN0ZDo6aXN0cmVhbV9pdGVyYXRvcjxzdGQ6OnN0cmluZz4gZW5kOwogICAgIAogICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IHdvcmRDb3VudCA9IHN0ZDo6Zm9yX2VhY2goc3RhcnQsIGVuZCwgQ291bnRlcigpKTsKICAgICAKICAgICBmb3IgKHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+OjppdGVyYXRvciBpdCA9IHdvcmRDb3VudC5iZWdpbigpOyBpdCAhPSB3b3JkQ291bnQuZW5kKCk7ICsraXQpCiAgICAgewogICAgICAgICAgc3RkOjpjb3V0IDw8IGl0LT5maXJzdCA8PCIgOiAiPDwgaXQtPnNlY29uZCA8PCBzdGQ6OmVuZGw7CiAgICAgfQogfQ==