5

我编写了一个类似于迭代器的类来解析 CSV 格式的文件。我还编写了其他类来读取特定的 csv 文件以直接填充 MyObject 结构。因此可以像这样使用该类(我删除了代码的错误处理部分):

std::ifstream in(filename);
MyObjectParser parser(in);
MyObjectParser::Iterator it;
for (it = parser.begin(); it != parser.end(); it++)
{
   MyObject b = *it; 
   // do some stuff here ...
}

该程序运行良好,我对此感到满意,但我意识到迭代器的隐含含义(仅对我自己而言?)是它将迭代一个集合。在这种情况下,没有集合,只有一个流。

我是否应该更喜欢一种明确建议我通过重载>>运算符来使用流的形式,从而具有类似的东西:

std::ifstream in(filename);
MyObjectReader reader(in);
MyObject obj;
while(reader >> obj)
{
    // do the same "some stuff" here...
}

仅仅是口味问题吗?我看不清楚有什么区别(除了在第二种形式中,对象只是填充而不是复制)以及选择第一种或第二种形式的后果是什么。

我很乐意获得其他一些意见,以便确切了解我为什么使用解决方案而不是其他解决方案。

4

2 回答 2

6

如果需要,您可以将流视为集合。

但是,我要注意,通过重载,您可以同时拥有两者——您可以直接operator>>使用从流中显式读取数据,或者您可以通过将流视为集合来将其视为集合。operator>>std::istream_iterator<whatever>

既然如此,在我看来,重载operator>>是显而易见的选择,因为从那时起,您可以以任何一种方式处理事情,基本上不需要额外的工作。此外,usingstd::istream_iterator<x>是一个相当容易识别的习惯用法,因为它包含在标准库中。

于 2013-02-25T15:49:27.930 回答
2

迭代的概念不依赖于容器的概念。迭代器迭代一系列值。不同的迭代器设计对序列的定义方式不同,但始终存在当前值、前进和结束的思想。输入迭代器的唯一问题是它们只在文件末尾终止;例如,您不能说接下来的 10 行包含双精度数,然后我们继续讨论其他内容。(当然,你可以在流中插入一个过滤streambuf来检测结束。)

于 2013-02-25T16:05:10.333 回答