#include <iostream>
#include <vector>
#include <string>

struct char_counter
{
    char_counter( char first = 'a', char last = 'z' ) : first(first), last(last)
    { if( first <= last ) amounts.resize(last-first+1) ; }

    char_counter& operator << ( char c )
    { if( c >= first && c <= last ) ++amounts[c-first] ; return *this ; }

    char_counter& operator << ( const char* p )
    { for( ; *p != 0 ; ++p ) operator<< (*p) ; return *this ; }

    char_counter& operator << ( const std::string& str )
    { for( char c : str ) operator<< (c) ; return *this ; }

    std::vector<int> amounts ;
    const char first ;
    const char last ;
};

std::ostream& operator<< ( std::ostream& stm, const char_counter& counter )
{
    stm << "counts [" << counter.first << '-' << counter.last << "]: { " ;
    for( std::size_t i = 0 ; i < counter.amounts.size() ; ++i  )
    {
        int cnt = counter.amounts[i] ;
        if( cnt > 0 ) stm << char( i + counter.first ) << ':' << cnt << ' ' ;
    }
    return stm << '}' ;
}

int main()
{
    char_counter counter ;
    counter << 'a' << "abcde" << std::string("defg") << 'f' << "a?c?d?e?g?x" ;
    std::cout << counter << '\n' ;
}
