覆盖`istream operator >>`与使用`sscanf`

时间:2018-08-08 22:09:08

标签: c++ scanf istream

说我想初始化std::vector个对象,例如

class Person { int ID; string name; ...}

,该文件包含每个对象的一行。一种途径是覆盖operator>>并仅覆盖std::cin>>temp_person,另一种途径-我曾经倾向于使用sscanf("%...", &...)一堆临时基元类型,而仅覆盖.emplace_back(Person(temp_primitives...)

哪种方法可以实现最快的运行时忽略内存占用? mmap()整个文件有什么意义吗?

1 个答案:

答案 0 :(得分:9)

由于您正在读取文件,因此性能将受到I / O的限制。几乎无论您在内存中做什么,都无法检测到对整体性能的影响。

我更喜欢operator>>路由,因为这将使我使用C ++的输入迭代器惯用法:

std::istream_iterator<Person> eos;
std::istream_iterator<Person> iit(inputFile);
std::copy(iit, eos, std::back_inserter(person_vector));

甚至

std::vector<Person>   person_vector(
    std::istream_iterator<Person>(inputFile)
,   std::istream_iterator<Person>()
);