`
shi5jin
  • 浏览: 38027 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

A Generic Ostream Iterator

阅读更多
by Christopher Diggins
November 11, 2005

    Summary
    Ostream iterators are a handy but under-utilized tool for using the STL to output containers and ranges. Here I provide an alternative, which has a more pleasing syntax.

An ostream iterator, allows you to use STL algorithms, such as std::copy to output a container or range to an output stream. A simple example is:

int main() {
  int array[] = { 1, 2, 4, 8, 16, 32, 64 };
  std::copy(array, array + 7, std::ostream_iterator<int>(std::cout, "\n"));
}

The declaration for an ostream_iterator is clunky because you to know the kind of elements it will be reading. You can make the code more readable as follows:

int main() {
  int array[] = { 1, 2, 4, 8, 16, 32, 64 };
  typedef std::ostream_iterator<int> oiter;
  std::copy(array, array + 7, oiter(std::cout, "\n"));
}

This is still more complex than strictly neccessary. The problem is that the ostream_iterator is a template. An alternative implementation would be to make the operator=() member function a template.

#include <iostream>

struct putter {
  putter(const putter& x) : o(x.o), delim(x.delim) { }
  putter(std::ostream& x = std::cout, const char* s = "") : o(x), delim(s) { }
  template<typename T>
  putter& operator=(const T& x) { o << x << delim; return *this; }
  putter& operator*() { return *this; }
  putter& operator++() { return *this; }
  putter& operator++(int) { return *this; }
  mutable std::ostream& o;
  const char* delim;
};

putter put(std::ostream& o = std::cout, const char* delim = "") {
  return putter(o, delim);
}

Now you can output the contents of any iterator pair with less work.

int main() {
  int array[] = { 1, 2, 4, 8, 16, 32, 64 };
  std::copy(array, array + 7, put(std::cout, "\n"));
}
分享到:
评论

相关推荐

    ostream用法解释

    ostream_iterator是流迭代器,属于标准模板库中的一个类模板。流迭代器可以用来读写流中的数据。例如,ostream_iterator指定了类型,就是迭代器读写的类型。通过这个流迭代器,可以把要输入的数据写入到指定的流中。...

    C语言头文件 OSTREAM.H

    C语言头文件 OSTREAM.HC语言头文件 OSTREAM.HC语言头文件 OSTREAM.HC语言头文件 OSTREAM.HC语言头文件 OSTREAM.HC语言头文件 OSTREAM.HC语言头文件 OSTREAM.HC语言头文件 OSTREAM.HC语言头文件 OSTREAM.HC语言头文件...

    istream_iterator 读取输入文件

    C++ primer 第五版 中文版 练习 10.33 题目:编写程序,接受三个参数:一个输入文件和两个输出...使用ostream_iterator将奇数写入第一个输出文件,每个值后都跟一个空格。将偶数写入第二个输出文件,每个值都独占一行。

    流类库与输入输出(ostream,ofstream,ostringstream)

    `ostream`类代表了一个输出流的对象,它是流类库中的一个核心类。通常用于将数据输出到标准输出设备(如屏幕)。`cout`是一个预定义的`ostream`对象,用于标准输出。 ##### 特点: - 默认关联于标准输出设备。 - ...

    C语言头文件 OSTREAM

    C语言头文件 OSTREAMC语言头文件 OSTREAMC语言头文件 OSTREAMC语言头文件 OSTREAMC语言头文件 OSTREAMC语言头文件 OSTREAMC语言头文件 OSTREAMC语言头文件 OSTREAMC语言头文件 OSTREAMC语言头文件 OSTREAMC语言...

    ostream头文件(in Dev-cpp)

    c++文件输出类

    Text-To-Speech-ostream

    `CodeProject audio_ostream - A Text-to-Speech ostream_ Free source code and programming help_files`可能是辅助资源文件,如图片、样式表或JavaScript脚本,用于支持网页文档的展示。 综上所述,Text-To-...

    C++迭代器介绍(iterator、const_iterator、reverse_interator、const_reverse_interator)

    它们通常用于向输出流(如文件或`std::ostream`)写入数据,例如`std::ostream_iterator`。 3. **向前迭代器(Forward Iterator)**:在输入迭代器的基础上,向前迭代器还支持前向移动多次,但仍然不支持后退。例如...

    c++程序设计知识点总结(谭浩强).docx

    9. **迭代器适配器(Iterator Adapters)**:如`istream_iterator`和`ostream_iterator`,分别允许从输入流(如键盘)读取数据,并将数据写入输出流(如屏幕)。 以上就是C++程序设计的一些核心知识点,理解和熟练...

    stl学习总结

    std::ostream_iterator&lt;int&gt; out_it(std::cout, " "); for (auto i : vector1) { *out_it = i; // 输出vector中的元素 ++out_it; } ``` ##### 输入迭代器(Input Iterator) 输入迭代器支持解引用操作`*first`来...

    c++使用stl进行系列化和反系列化.docx

    在这个例子中,我们使用了`std::vector`、`std::ifstream`、`std::ofstream`、`std::istream_iterator`、`std::ostream_iterator`以及`std::back_inserter`等STL组件。 1. **序列化到文件**: 序列化是将数据结构...

    二维vector源码实现

     ostream_iterator&lt;int&gt; os(cout, " ");  Matrix[0][2] = 4;  //交换矩阵的两行  Matrix[0].swap(Matrix[1]);  //交换矩阵第二行的两个元素  swap(Matrix[1][0], Matrix[1][2]);  for (uint i = 0; i (); i++...

    audio_ostream-文本到语音的ostream

    在本文中,我们将深入探讨如何使用C++编程语言,特别是在Visual C++ 6.0 (VC6) 和Visual Studio环境中,通过ostream接口实现文本到语音(Text-to-Speech,TTS)的功能。这个功能通常用于增强应用程序的用户体验,...

    VC++入门经典(part2)

    输出流迭代器 (`ostream_iterator&lt;T&gt;`) 与输入流迭代器类似,但它用于将容器中的数据输出到流中。构造函数同样接受指向流的指针作为参数,通常为 `std::cout` 或其他输出流对象。 **示例代码**: ```cpp #include ...

    c++程序设计(刘振安)程序举例[文].pdf

    `std::copy`用于复制数组,`std::reverse_copy`用于反向复制,`std::sort`对数组进行排序,`std::ostream_iterator`则用于将元素输出到流中。这个例子展示了数组的正向输出、逆向输出、复制和排序。 例 1.7 进一步...

    自考c++知识点总结.docx

    - 输出数组:`copy(a, a + len, ostream_iterator(cout, " "));` 6. 输入/输出格式控制: - C++提供两种格式控制方式:`ios_base`类接口和操控符函数。 - 无参数控制符:如`dec`, `oct`, `hex`控制基数,`endl`...

    STL中set用法详解.pdf

    这些集合操作返回的结果通常需要通过`insert_iterator`插入到一个新的set中,或者使用`copy()`函数配合`ostream_iterator`将其输出到控制台。 在实际编程中,`set`常用于存储不重复的元素,并且提供快速查找和集合...

    STL迭代器类型

    ostream_iterator 和 ostreambuf_iterator 是两种预定义的输出迭代器,用于向输出流中写入数据。 3. 前向迭代器(Forward Iterator) 前向迭代器是一种多次读/写的迭代器,包含了输入和输出迭代器的功能。它可以...

    audio_ostream_src.zip_C# TTS_tts

    标题中的"audio_ostream_src.zip_C# TTS_tts"表明这是一个关于C#语音合成(Text-to-Speech,简称TTS)的项目,其中可能包含了实现TTS功能的源代码。"C# TTS"是关键,暗示我们将讨论C#编程语言如何与文本转语音引擎...

    数据结构 模板与迭代器

    示例:`std::ostream_iterator` - **前向迭代器**:只能向前移动,支持读写操作。 示例:`std::list` 和 `std::forward_list` 的迭代器 - **双向迭代器**:可以前后移动,支持读写操作。 示例:`std::...

Global site tag (gtag.js) - Google Analytics