📜  C++ STL中的std :: istream_iterator和std :: ostream_iterator

📅  最后修改于: 2021-05-30 11:11:25             🧑  作者: Mango

STL是C++中非常强大的库。它强烈地基于模板编程的原理。
STL库具有三个主要组件:

  1. 容器:这些类定义用于包含数据的数据结构。数据可以存储在链表,树或数组中。 STL中提供的容器是矢量,出队,列表,转发列表,集合,多集,映射和多图。
  2. 算法: STL库还为我们提供了处理容器中存储的数据的功能。这些函数在算法头文件中提供
  3. 迭代器:迭代器是容器和算法之间的链接。它们是这些类的通用接口。迭代器是一个对象,可用于对容器中的元素进行迭代。因此,算法使用迭代器来修改容器。

所有这三个组件都经过精心设计,以确保它们符合数据抽象的原理。因此,任何保存数据并表现得像容器的对象都是容器。同样,任何遍历容器中元素的迭代器都是一个迭代器。

如果可以使用迭代器访问数据容器的元素,那么流又如何呢?为了与设计保持一致,Streams也是数据容器,因此C++为我们提供了迭代器,以迭代任何流中存在的元素。这些迭代器称为流迭代器。要使用这些迭代器,必须包含迭代器头文件。

流迭代器
可以是输入流迭代器,也可以是输出流迭代器。这些迭代器的类为istream_iteratorostream_iterator。这些迭代器的行为分别类似于输入迭代器和输出迭代器

istream_iterator

istream_iterator的类定义

namespace std {
    template < typename T, typename charT=char, 
               typename traits=char_traits  >
    class istream_iterator;
}

句法 :

istream_iterator(stream)
T:      Template parameter for specifying type of data
stream: The object representing the stream
ostream_iterator(stream, delim).
stream: The object representing the stream.
T:      Template Parameter for data type in the stream
delim:  An optional char sequence that is used to 
        separate the data items while displaying them.

笔记 :

  • 使用迭代器,我们只能访问一种类型的元素。
  • istream_iterator具有迭代器的特殊状态结束,当到达流的末尾或输入操作失败时,将获取它。流迭代器的结尾由默认构造函数返回。

ostream_iterator

ostream_iterator的类定义

namespace std {
    template < typename T, typename charT=char, 
               typename traits=char_traits  >
    class ostream_iterator;
}

句法 :

OutputIterator copy (InputIterator first, InputIterator last, OutputIterator result);

first: Input Iterator to the first element 
in source from where elements need to be copied.
last:  Input Iterator to the last element 
in source till where elements need to be copied.
result: Output iterator to the first element 
in the destination container to where elements will copied.

Return Value: Iterator pointing to the last element that was copied to the destination.

第二个和第三个模板参数具有分配给它们的默认值。我们只需要指定第一个模板参数,该参数指定流中存在的数据类型,即流是否包含整数,浮点数或字符串。

例子 :

istream_iterator cin_it(cin) is an iterator for the stream cin.
ostream_iterator cout_it(cout, " ") is an iterator for the stream cout.
ostream_iterator cout_it(cout) is an iterator for stream cout, with no delimeter.

流迭代器的重要性

流迭代器的优点是,它们提供了一个公共接口来访问I / O流,文件流以及其他流到外部物理设备的元素。

  • 一旦获得了对各个流的迭代器,则后面的代码在所有类型的流中几乎都是相同的。
  • 因此,诸如从输入流读取和从另一个外部流读取的任务变得相似。
  • 流迭代器使我们能够访问所有强大的STL算法,例如for_each,replace_if,它们需要输入范围进行操作。一个特别有用的函数是copy()函数。此函数用于将元素从一个容器复制到另一个容器。
  • 使用copy()函数,我们可以轻松地将数据从流传输到容器,反之亦然。以下是一些示例程序,以演示如何使用流迭代器

例子1

// Cpp program to illustrate
// Read a bunch of integers from the input stream
// and print them to output stream
  
#include 
#include 
#include 
  
using namespace std;
int main()
{
  
    // Get input stream and end of stream iterators
    istream_iterator cin_it(cin);
    istream_iterator eos;
  
    // Get output stream iterators
    ostream_iterator cout_it(cout, " ");
  
    // We have both input and output iterators, now we can treat them
    // as containers. Using copy function we transfer data from one
    // container to another.
    // Copy elements from input to output using copy function
    copy(cin_it, eos, cout_it);
  
    return 0;
}
Input: 1 2 3 4 5 
Output: 1 2 3 4 5

例子2

// Cpp program to illustrate
// Read a bunch of strings from a file
// sort them lexicographically and print them to output stream
  
#include 
#include 
#include 
#include 
#include 
#include 
  
using namespace std;
int main()
{
  
    // Define a vector to store the strings received from input
    vector strings_v;
  
    // Define the filestream object used to read data from file
    ifstream fin("input_file.txt");
  
    // Get input stream and end of stream iterators
    istream_iterator fin_it(fin);
    istream_iterator eos;
  
    // Get output stream iterators
    ostream_iterator cout_it(cout, " ");
  
    // Copy elements from input to vector using copy function
    copy(fin_it, eos, back_inserter(strings_v));
  
    // Sort the vector
    sort(strings_v.begin(), strings_v.end());
  
    // Copy elements from vector to output
    copy(strings_v.begin(), strings_v.end(), cout_it);
  
    return 0;
}
Contents of File "input_file.txt": quick brown fox jumps over the lazy dog
Output: brown dog fox jumps lazy over quick the 

范例3:

// Cpp program to illustrate
  
// Read a bunch of integers from the stream
// print the sorted order of even integers only
  
#include 
#include 
#include 
#include 
  
using namespace std;
int main()
{
  
    // Define a vector to store the even integers received from input
    vector vi;
  
    // Get input stream and end of stream iterators
    istream_iterator cin_it(cin);
    istream_iterator eos;
  
    // Get output stream iterators
    ostream_iterator cout_it(cout, " ");
  
    // Copy even integer elements from input to vector using for_each function
    for_each(cin_it, eos, [&](int a) {
        if (a % 2 == 0) {
            // if a is even push it to vector
            vi.push_back(a);
        }
    });
  
    // Sort the vector
    sort(vi.begin(), vi.end());
  
    // Copy elements from vector to output
    copy(vi.begin(), vi.end(), cout_it);
  
    return 0;
}
Input: 1 4 3 2 6 8 31 52 
Output: 2 4 6 8 52 

参考:
istream_iterator
ostream_iterator

要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”