输入巨大字符串的最快方式

Fastest way to input huge strings?

本文关键字:方式 巨大 字符串 输入      更新时间:2023-10-16

我必须从stdin中读取大量字符串,因此时间是一个关键问题。字符串在连续的行上,没有空格,所以我可以简单地使用while(cin>>str) { //code },但这非常慢。我听说scanf比cin快得多,但如果我使用scanf("%s,str),我认为str被视为char*,而不是C++string,所以我不能使用STL。我可以将输入作为char*,并将所有字符复制到C++字符串中,但IMO也会很慢。

有没有一种方法可以使用scanf或其他东西获得输入,但结果仍然是获得C++字符串?

如果您知道文本的平均或最大大小,则可以创建具有预先分配的大小的std::string。占用大量时间的一个区域是std::string的存储器(重新)分配。

cin >> str是STL中最接近scanf("%s, str")的东西。scanfcin快的唯一原因是,它会给你一个char*而不是一个字符串,虽然你可以通过将它们传递给string()构造函数来从char*创建一个新字符串,但这几乎与使用cin >> str相同。

您可以使用getline:

for (std::string line; getline(std::cin, line); ) {
  do_something_with(line);
}

我不知道它是否比cin >> line快,但它可能快,因为它不需要处理换行以外的空白。但我认为这并不像哨兵建设的开销那么重要。