c++ - 用标准 C++ 从文件中读取的最快方法是什么?
问题描述
如果我有一个包含数十亿字符的文件,那么在不使用外部库的情况下读取它的最快方法是什么(主要要求竞争性编程)?
我发现一篇文章展示了这个例子,并说使用类比使用InParser
类更快ifstream
(这里是链接,但它不是英文的,所以我认为它没有多大帮助:https ://infogenius.ro /parsare-cpp/)。它说,当您直接使用 读取时ifstream
,引擎盖下会发生一些事情会减慢速度,因此最好将整个文件作为字符串读取,然后转换为其他数据类型(本例中为int)你自己。
class InParser {
private:
vector<char> str;
int ptr;
ifstream fin;
char getChar() {
if (ptr == (int) str.size()) {
fin.read(str.data(), str.size());
ptr = 0;
}
return str[ptr++];
}
template<class T>
T getInt() {
char chr = getChar();
while (!isdigit(chr) && chr != '-')
chr = getChar();
int sgn = +1;
if (chr == '-') {
sgn = -1;
chr = getChar();
}
T num = 0;
while (isdigit(chr)) {
num = num * 10 + chr - '0';
chr = getChar();
}
return sgn * num;
}
public:
InParser(const char* name) : str(1e5), ptr(str.size()), fin(name) { }
~InParser() { fin.close(); }
template<class T>
friend InParser& operator>>(InParser& in, T& num) {
num = in.getInt<T>();
return in;
}
};
int main() {
InParser fin("file.in");
int a; int64_t b; fin >> a >> b;
cout << a + b << '\n';
return 0;
}
我的问题是:
这种方法比仅仅使用更快
std::ifstream fin("file.in");
吗?有没有更好的方法可以在不使用外部库的情况下做到这一点?
解决方案
推荐阅读
- github - 我需要输入什么代码才能使 expo 项目功能?
- visual-studio - 如何在 F# 中启用 WinForms 或 WPF 项目?
- sqlite - SQLite.net 数据库与 Xamarin.Forms 应用程序
- scala - 如何在异常时停止 Actor 重新加载
- c# - 在c#中运行更新查询后数据库没有变化
- python - 检查某个数字序列是否出现在数组中。我的想法有什么问题?
- c# - 在函数调用 Visual Studio 键盘快捷键中包装变量
- javascript - 通过 WKWebView 使用 Javascript、AngularJS 在设备上保存数据以自动填充表单
- wordpress - 在 Wordpress 的一般部分中添加字段
- sql-server - TFS 2015 - 在 SQL Server 中跟踪“正在做和完成”子列