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

overriding `istream operator>>` vs using `sscanf`

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

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

来自包含每个对象一行的文件。一种方法是覆盖 operator>> 和简单的 std::cin>>temp_person,另一种方法——我过去喜欢的方法是使用 sscanf("%...", &...) 一堆临时原始类型和简单的 .emplace_back(Person(temp_primitives...)

忽略内存占用,哪种方式运行速度最快? mmap() 处理整个文件有什么意义吗?

由于您正在读取文件,因此性能将是 I/O-bound。几乎无论您在内存中做什么,对整体性能的影响都不会被检测到。

我更喜欢 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>()
);