Нет, не совсем. ostream_iterator
не настраивается таким образом.
Так что вам придется использовать «обходной путь» перед пробелом, как в других ответах, и вручную отрубить эту последнюю строку.
BTW Было отмечено , что &v[3]
, строго говоря, вызывает неопределенное поведение из-за неявного разыменования в подвыражении v[3]
. Предпочитаю &v[0]+3
(или просто v+3
) & mdash; «иметь» указатель на один за концом массива - это нормально, если только он не разыменован.
Вы можете создать свой собственный вид ostream_iterator
, который делает это, как показано в следующем примере.
Да, это многословно; тем не менее, вы также можете изменить его по своему усмотрению:
#include <iostream>
#include <iterator>
#include <algorithm>
template <class T, class charT = char, class traits = std::char_traits<charT> >
struct ostream_iterator_x
: std::iterator<std::output_iterator_tag, void, void, void, void> {
typedef charT char_type;
typedef traits traits_type;
typedef std::basic_ostream<charT,traits> ostream_type;
ostream_iterator_x(ostream_type& s, const charT* pre = 0, const charT* post = 0)
: s(s)
, pre(pre)
, post(post) {};
ostream_iterator_x(const ostream_iterator_x& x)
: s(x.s)
, pre(x.pre)
, post(x.post) {};
~ostream_iterator_x() {}
ostream_iterator_x& operator=(const T& value) {
if (pre != 0) s << pre;
s << value;
if (post != 0) s << post;
return *this;
}
ostream_iterator_x& operator*() { return *this; }
ostream_iterator_x& operator++() { return *this; }
ostream_iterator_x& operator++(int) { return *this; }
private:
ostream_type& s;
const charT* pre;
const charT* post;
};
int main()
{
int v[] = { 1, 2, 3 };
std::copy(v, v+3, ostream_iterator_x<int>(std::cout, " ", "\n"));
}
// Output:
// 1
// 2
// 3
(я использовал [n3290: 24.6/2]
, чтобы определить членов и базовую спецификацию, необходимую для того, чтобы это работало и соответствовало стандартам.)