A generic Print function
A way of using STL algorithms combined with template functions as a means of printing the contents of any type of STL container (eg a std::vector
), containing any generic data type (eg int
, std::string
etc). typename
T defines the generic data type held by the container, while typename InputIterator
describes the STL container iterators passed to it:
template<typename T, typename InputIterator> void Print(std::ostream& ostr, InputIterator itbegin, InputIterator itend, const std::string& delimiter) { std::copy(itbegin, itend, std::ostream_iterator<T>(ostr, delimiter.c_str())); }
Example 1: std::set
containing std::string
s
This following example shows how the generic Print
function can output a std::set
containing std::string
data types:
#include <iostream> #include <algorithm> #include <iterator> #include <string> #include set> typedef std::set<std::string>::iterator iter_s; template<typename T, typename InputIterator> void Print(std::ostream& ostr, InputIterator itbegin, InputIterator itend, const std::string& delimiter) { std::copy(itbegin, itend, std::ostream_iterator<T>(ostr, delimiter.c_str())); } int main() { std::string str[] = { "The", "cat", "in", "the", "hat" }; std::set<std::string> s( str, str + sizeof( str ) / sizeof( str[ 0 ] ) ); Print<std::string, iter_s>( std::cout, s.begin(), s.end(), "\n" ); return 0; }
Giving the following tokenized string output, delimited by newline characters, though not necessarily in the order they were inserted!
The cat hat in the
Example 2: std::vector
containing int
s
The following example shows how the same generic Print
function can be used to output a std::vector
containing int
data types:
#include <iostream> #include <algorithm> #include <iterator> #include <string> #include <vector> typedef std::vector<int>::iterator iter; template<typename T, typename InputIterator> void Print(std::ostream& ostr, InputIterator itbegin, InputIterator itend, const std::string& delimiter) { std::copy(itbegin, itend, std::ostream_iterator<T>(ostr, delimiter.c_str())); } int main() { int vals[] = { 1, 2, 3, 4 }; std::vector<int> v( vals, vals + sizeof( vals ) / sizeof( vals[ 0 ] ) ); Print<int, iter>( std::cout, v.begin(), v.end(), " " ); return 0; }
Which print the set of integers stored in the std::vector
, separated by whitespaces:
1 2 3 4