Re: Missing functionality
I would also like to see copy_n in the standard. However, I have found
copy_n to be very error prone with iostream iterators. In fact, all the
available implementations are somehow dangerous.
One could assume that the code example Ex1 would produce same output as
the standard copy does but it does not. The correct way to achieve
identical output is shown in the Ex2. Unfortunately, real advantage for
using copy_n to read data from input stream would be something similar
that Ex3 tries to do. However, using that in your code would really
ruin your day!
Here is an old posting about the copy_n to stlport forum if someone
happens to be interested to create proper implementation for copy_n.
http://www.stlport.com/dcforum/DCForumID6/1966.html
#include <sstream> // for istringstream
#include <algorithm> // for copy_n
#include <iterator> // for istream_iterator and ostream_iterator
#include <iostream> // for cout
#include <string> // for string
using namespace std;
template <class _InputIter, class _Size, class _OutputIter>
pair<_InputIter, _OutputIter> copy_n(_InputIter __first, _Size __count,
_OutputIter __result) {
for ( ; __count > 0; --__count) {
*__result = *__first;
++__first;
++__result;
}
return pair<_InputIter, _OutputIter>(__first, __result);
}
int main()
{
// Ex1
istringstream ex1("a b c d e f");
copy_n(istream_iterator<char>(ex1),2,
ostream_iterator<char>(cout, " "));
copy_n(istream_iterator<char>(ex1),2,
ostream_iterator<char>(cout, " "));
copy_n(istream_iterator<char>(ex1),2,
ostream_iterator<char>(cout, " "));
cout << '\n';
// Ex2
istringstream ex2("a b c d e f");
istream_iterator<char> itr2 = istream_iterator<char>(ex2);
itr2 = copy_n(itr2,2,ostream_iterator<char>(cout, " ")).first;
itr2 = copy_n(itr2,2,ostream_iterator<char>(cout, " ")).first;
itr2 = copy_n(itr2,2,ostream_iterator<char>(cout, " ")).first;
cout << '\n';
// Ex3
istringstream ex3("11 22 AA BB 33 44 CC DD");
copy_n(istream_iterator<int>(ex3),2,
ostream_iterator<int>(cout, " "));
copy_n(istream_iterator<string>(ex3),2,
ostream_iterator<string>(cout, " "));
copy_n(istream_iterator<int>(ex3),2,
ostream_iterator<int>(cout, " "));
copy_n(istream_iterator<string>(ex3),2,
ostream_iterator<string>(cout, " "));
cout << '\n';
return 0;
}
---
[ comp.std.c++ is moderated. To submit articles, try just posting with ]
[ your news-reader. If that fails, use mailto:std-c++@ncar.ucar.edu ]
[ --- Please see the FAQ before posting. --- ]
[ FAQ: http://www.comeaucomputing.com/csc/faq.html ]