streambuf,ostream,ostreambuf,istream,istreambuf和相关的迭代器

时间:2012-08-09 21:11:14

标签: c++ stl stream iterator buffer

我想有人不得不问这些问题,所以请耐心等待。

让我们考虑以下野兽:

  • ostream的
  • istream的
  • 的iostream
  • 流缓冲
  • string - 按照本杰明的观察,这个不属于这里。
  • 的StringBuf

以及以下迭代器:

  • ostream_iterator
  • ostreambuf_iterator
  • istream_iterator
  • istreambuf_iterator

问题:

为什么没有iostream_iteratorstreambuf_iterator string_iterator (std :: string :: iterator和std :: string :: const_iterator)存在)或stringbuf_iterator

为什么上面列出的4个迭代器没有像std::vector<T>::const_iterator这样的const版本?

如果他们不提供begin()和end()方法,我们如何迭代任何这些野兽?上述4个迭代器的目的是什么?

N00b问题:我在哪里可以找到一个很好的参考资料来详细说明这些类背后的逻辑,还有一些关于如何使用它们的正确例子?

希望有经验的人能为上述问题提供一个好的答案。


PS:真实生活情况:

void writeToStream(std::ostream &out);
int main ()
{
    std::ostringstream byteStream;
    writeToStream(byteStream);
    std::string byteString = byteStream.str();

    for (unsigned short i = 0; i < byteString.size(); ++i)
    {
        //do something with each byteString[i]
    }
    return 0;
}

我的猜测是我可以使用ostream并使用迭代器迭代其元素,就像std::vector一样,而不是使用ostringstreamstr()方法将其转换为string,但我找不到任何有关此内容的信息。

3 个答案:

答案 0 :(得分:3)

  

为什么没有iostream_iterator,streambuf_iterator或者   stringbuf_iterator?

我不知道。虽然我猜它只是因为它们会更复杂,而且对它们的需求不足。

  

为什么上面列出的4个迭代器没有像这样的const版本   std::vector<T>::const_iterator

const输入迭代器相当多余,你只能从它们读取,而不是写入它们。一个const输出迭代器是没有意义的,因为这会破坏它唯一的目的,即输出。

  

如果他们不这样做,我们应该如何迭代任何这些野兽   提供begin()和end()方法?这个目的是什么?   4个以上的迭代器?

通过使用各自的构造函数创建迭代器,例如

std::istream_iterator<int> in_begin(std::cin), in_end;
std::ostream_iterator<int> out_begin(std::cout, "\n");
std::copy(in_begin, in_end, out_begin);

请注意,istream_iterator的结束迭代器是通过简单地不向其构造函数传递参数而创建的,并且对于输出迭代器没有等效的end()

答案 1 :(得分:3)

  

为什么没有:
  * iostream_iterator
  * streambuf_iterator

不知道。可能是因为在进行输入和输出时很难定义语义。当你使用迭代器前进然后向后流时,你期望发生什么?

  
      
  • string_iterator
  •   
  • stringbuf_iterator?
  •   

现有的迭代器很容易涵盖这些:

std::string                  line; // load line.
std::stringstream            linestream(line);
std::istream_iterator<int>   lineIterator(linestream);
  

为什么上面列出的4个迭代器没有像std :: vector :: const_iterator那样的const版本?

因为当您遍历流时,流的状态正在发生变化。

  

如果他们不提供begin()和end()方法,我们如何迭代任何这些野兽?上述4个迭代器的目的是什么?

因为流通常是一个方向。您不是从头开始迭代,而是从流中的当前位置迭代到结束。所以你只需要声明一个指定流的迭代器。迭代器从当前位置开始并向末尾移动。您可以通过不对流进行分段来声明流迭代器的结束。

 std::istream_iterator<int>   loop(std::cin);
 for(;loop != std::istream_iterator<int>(); ++loop)
 {
     std::cout << *loop;
 }
  

N00b问题:我在哪里可以找到一个很好的参考资料来详细说明这些类背后的逻辑,还有一些关于如何使用它们的正确例子?

这是一个好地方 搜索“C ++ istream_iterator”你会得到很多点击。

  

希望有经验的人能为上述问题提供一个好的答案。

希望。

答案 2 :(得分:1)

这些流迭代器的存在是为了使用标准算法直接从/向容器写入/读取流。所以不要写

for (vector<int>::iterator i=v.begin(); i!=v.end(); ++i)
    cout << *i <<"\n";

你可以使用std :: copy:

copy(v.begin(), v.end(), ostream_iterator(cout, "\n"));

如需参考,请检查thisTC++PL之类的内容。恕我直言,他们是一个巧妙的技巧,但实际上并没有多大帮助,因为你几乎无法控制输入/输出。