使用迭代器读取格式化流是件好事吗
is it a good thing to use iterators to read on a formatted 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 ...
}
该程序运行良好,我对此感到满意,但我意识到迭代器的隐含含义(仅对我自己而言?(是它将在集合上迭代。在这种情况下,没有集合,只有一个流。
我应该更喜欢一种通过重载>>运算符明确建议我使用流的形式吗因此有了这样的东西:
std::ifstream in(filename);
MyObjectReader reader(in);
MyObject obj;
while(reader >> obj)
{
// do the same "some stuff" here...
}
这只是品味的问题吗?我看不清楚有什么区别(除了在第二种形式中,对象只是填充而不是复制(,以及选择第一种或第二种格式会产生什么后果
我很乐意得到一些其他的意见,以便确切地知道为什么我使用一个解决方案而不是另一个。
如果需要,可以将流视为集合。
然而,我要注意的是,通过重载operator>>
,您可以同时拥有这两者——您可以直接使用operator>>
显式地从流中读取数据,或您可以使用std::istream_iterator<whatever>
将流视为集合来将其视为集合。
在这种情况下,在我看来,重载operator>>
是显而易见的选择,因为从那时起,你可以用任何一种方式处理事情,基本上不需要额外的工作。此外,使用std::istream_iterator<x>
是一个相当容易识别的习惯用法,因为它包含在标准库中。
迭代的概念并不依赖于容器的概念。迭代程序对一系列值进行迭代。不同的迭代器设计以不同的方式定义序列,但始终以当下的价值观念,前进并走到最后。输入迭代器的唯一问题是它们在文件末尾终止;例如,你不能说接下来的10行包含双打,然后我们继续其他的东西。(当然,您可以插入一个筛选流中的streambuf以检测结束。(
- 使用std::multimap迭代器创建std::list
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++中带有List类的迭代器Segfault
- 如何在c++迭代器类型中包装std::chrono
- 集合上的输出迭代器:assign和increment迭代器
- Boost Spirit,获取迭代器内部语义动作
- 如何从文件中读取 n 个字节并使用<uint8_t>迭代器将它们放入向量中?
- 无法使用迭代器在类对象的向量中读取向量
- 输入迭代器可以重复读取,而输出迭代器只能写入一次
- 我可以读取向量<string>::迭代器的数字位置吗?
- 正确读取二进制文件并使用流迭代器
- 字符串迭代器与读取每一行不兼容
- 使用迭代器数组读取稀疏信息
- Valgrind在简单迭代器类中检测到无效读取错误
- 读取大小为4的迭代器无效
- 我可以(a)不通过输入迭代器写入,或者(b)只通过一个迭代器读取一次吗?
- 迭代器应该读取整个数字,但它只读取第一位数字
- 使用迭代器读取格式化流是件好事吗
- 读取矢量迭代器时访问错误
- 使用C++迭代器从文件中读取列表