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_iterator是流迭代器,属于标准模板库中的一个类模板。流迭代器可以用来读写流中的数据。例如,ostream_iterator指定了类型,就是迭代器读写的类型。通过这个流迭代器,可以把要输入的数据写入到指定的流中。...
C语言头文件 OSTREAM.HC语言头文件 OSTREAM.HC语言头文件 OSTREAM.HC语言头文件 OSTREAM.HC语言头文件 OSTREAM.HC语言头文件 OSTREAM.HC语言头文件 OSTREAM.HC语言头文件 OSTREAM.HC语言头文件 OSTREAM.HC语言头文件...
C++ primer 第五版 中文版 练习 10.33 题目:编写程序,接受三个参数:一个输入文件和两个输出...使用ostream_iterator将奇数写入第一个输出文件,每个值后都跟一个空格。将偶数写入第二个输出文件,每个值都独占一行。
`ostream`类代表了一个输出流的对象,它是流类库中的一个核心类。通常用于将数据输出到标准输出设备(如屏幕)。`cout`是一个预定义的`ostream`对象,用于标准输出。 ##### 特点: - 默认关联于标准输出设备。 - ...
C语言头文件 OSTREAMC语言头文件 OSTREAMC语言头文件 OSTREAMC语言头文件 OSTREAMC语言头文件 OSTREAMC语言头文件 OSTREAMC语言头文件 OSTREAMC语言头文件 OSTREAMC语言头文件 OSTREAMC语言头文件 OSTREAMC语言...
c++文件输出类
`CodeProject audio_ostream - A Text-to-Speech ostream_ Free source code and programming help_files`可能是辅助资源文件,如图片、样式表或JavaScript脚本,用于支持网页文档的展示。 综上所述,Text-To-...
它们通常用于向输出流(如文件或`std::ostream`)写入数据,例如`std::ostream_iterator`。 3. **向前迭代器(Forward Iterator)**:在输入迭代器的基础上,向前迭代器还支持前向移动多次,但仍然不支持后退。例如...
9. **迭代器适配器(Iterator Adapters)**:如`istream_iterator`和`ostream_iterator`,分别允许从输入流(如键盘)读取数据,并将数据写入输出流(如屏幕)。 以上就是C++程序设计的一些核心知识点,理解和熟练...
std::ostream_iterator<int> out_it(std::cout, " "); for (auto i : vector1) { *out_it = i; // 输出vector中的元素 ++out_it; } ``` ##### 输入迭代器(Input Iterator) 输入迭代器支持解引用操作`*first`来...
在这个例子中,我们使用了`std::vector`、`std::ifstream`、`std::ofstream`、`std::istream_iterator`、`std::ostream_iterator`以及`std::back_inserter`等STL组件。 1. **序列化到文件**: 序列化是将数据结构...
ostream_iterator<int> os(cout, " "); Matrix[0][2] = 4; //交换矩阵的两行 Matrix[0].swap(Matrix[1]); //交换矩阵第二行的两个元素 swap(Matrix[1][0], Matrix[1][2]); for (uint i = 0; i (); i++...
在本文中,我们将深入探讨如何使用C++编程语言,特别是在Visual C++ 6.0 (VC6) 和Visual Studio环境中,通过ostream接口实现文本到语音(Text-to-Speech,TTS)的功能。这个功能通常用于增强应用程序的用户体验,...
输出流迭代器 (`ostream_iterator<T>`) 与输入流迭代器类似,但它用于将容器中的数据输出到流中。构造函数同样接受指向流的指针作为参数,通常为 `std::cout` 或其他输出流对象。 **示例代码**: ```cpp #include ...
`std::copy`用于复制数组,`std::reverse_copy`用于反向复制,`std::sort`对数组进行排序,`std::ostream_iterator`则用于将元素输出到流中。这个例子展示了数组的正向输出、逆向输出、复制和排序。 例 1.7 进一步...
- 输出数组:`copy(a, a + len, ostream_iterator(cout, " "));` 6. 输入/输出格式控制: - C++提供两种格式控制方式:`ios_base`类接口和操控符函数。 - 无参数控制符:如`dec`, `oct`, `hex`控制基数,`endl`...
这些集合操作返回的结果通常需要通过`insert_iterator`插入到一个新的set中,或者使用`copy()`函数配合`ostream_iterator`将其输出到控制台。 在实际编程中,`set`常用于存储不重复的元素,并且提供快速查找和集合...
ostream_iterator 和 ostreambuf_iterator 是两种预定义的输出迭代器,用于向输出流中写入数据。 3. 前向迭代器(Forward Iterator) 前向迭代器是一种多次读/写的迭代器,包含了输入和输出迭代器的功能。它可以...
标题中的"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::...