覆盖 `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>()
);
假设我想初始化 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>()
);