Lau*_*ent 5 c++ iterator operators stream
我编写了一个类似于解析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 ...
}
Run Code Online (Sandbox Code Playgroud)
该程序运行良好,我很满意它,但我意识到迭代器的隐含意义(仅对我自己?)是迭代一个集合.在这种情况下,没有集合而是流.
我是否应该更喜欢一个明确建议我通过重载>>运算符使用流的表单,从而得到类似的东西:
std::ifstream in(filename);
MyObjectReader reader(in);
MyObject obj;
while(reader >> obj)
{
// do the same "some stuff" here...
}
Run Code Online (Sandbox Code Playgroud)
这只是品味问题吗?我没有清楚地看到有什么区别(除了在第二种形式中对象只是填充而不是复制)以及选择第一种或第二种形式的后果是什么.
我很乐意得到一些其他的意见,以便确切地知道为什么我使用的是解决方案而不是另一种解决方案.
如果需要,可以将流视为集合.
我会注意,但是,通过超载operator>>,你可以兼得-你可以从流使用显式读取数据operator>>直接,或者您可以通过使用治疗流作为一个集合std::istream_iterator<whatever>把它作为一个集合.
在这种情况下,在我看来,重载operator>>是显而易见的选择,因为那时你可以用任何方式处理事情,基本上没有额外的工作.此外,使用std::istream_iterator<x>是一个相当容易识别的习惯用法,因为它包含在标准库中.