问题描述
如果我有一个包含数十亿个字符的文件,那么在不使用外部库的情况下(主要是为竞争性编程而寻求)的最快读取方法是什么?
我找到了一篇展示该示例的文章,并说使用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;
}
我的问题是:
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)