我想有人不得不问这些问题,所以请耐心等待。
让我们考虑以下野兽:
以及以下迭代器:
问题:
为什么没有iostream_iterator
,streambuf_iterator
, (std :: string :: iterator和std :: string :: const_iterator)存在)或string_iterator
stringbuf_iterator
?
为什么上面列出的4个迭代器没有像std::vector<T>::const_iterator
这样的const版本?
如果他们不提供begin()和end()方法,我们如何迭代任何这些野兽?上述4个迭代器的目的是什么?
N00b问题:我在哪里可以找到一个很好的参考资料来详细说明这些类背后的逻辑,还有一些关于如何使用它们的正确例子?
希望有经验的人能为上述问题提供一个好的答案。
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
一样,而不是使用ostringstream
和str()
方法将其转换为string
,但我找不到任何有关此内容的信息。
答案 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)