James Kanze wrote:
Fred Yu wrote:
I want to encode input text into html format such as
replace "<" with "<", replace "&" with "&". Could
you give me some ideas? Thanks.
Containers: std::map< char, std::string >
Iterators: std::istream_iterator, std:
stream_iterator
Algorithms: std::transform
Agreed for the first (although it may be overkill---in this
particular case, I think I'd go with a simple switch).
No real need for the second; just use istream::get() and
ostream:
ut() (or operator<< in some cases).
As to the third: how? You're replacing a single character
with a sequence of characters, and transform does a one to
one (which in practice makes it of fairly limited
utility---although I've used it with a vector<string>,
ostream_iterator, and as string transformer class that I've
written, which works something like $(patsubst...) in GNU
make).
I was thinking of something like this:
#include <iostream>
#include <iterator>
#include <map>
#include <algorithm>
#include <cassert>
struct encoder {
std::map< char, std::string > the_map;
encoder ( void ) {
the_map[ 'a' ] = "a";
// ...
the_map[ '&' ] = "&";
// ...
}
std::string const & operator() ( char ch ) const {
std::map< char, std::string >::const_iterator iter =
the_map.find( ch );
assert( iter != the_map.end() );
return ( iter->second );
}
};
int main ( void ) {
encoder the_encoder;
std::transform( std::istreambuf_iterator<char>( std::cin ),
std::istreambuf_iterator<char>(),
std:
stream_iterator<std::string>( std::cout, "" ),
the_encoder );
}