小编Jia*_*Liu的帖子

如何在C ++中快速输入数百万个整数?

我正在执行有关C ++中堆栈的数据结构编程任务。

在此作业中,我应该读取很多整数(在最坏的情况下,我应该读取1,600,000个整数),最后输出一些字符串。

作为一名学生,我提交了cpp源文件,然后网站对我的源代码进行了评估和评分。我得到了100%,但我想做得更好。此分配的时间限制为2秒,我的源代码的执行时间为128毫秒。但是,成绩最好的学生仅用52毫秒即可完成任务。所以我想知道如何使我的代码更快。

我的源代码主要包含三个部分:

  1. 使用cin从OnlineJudge系统中读取很多整数(最多1,600,000个整数)。
  2. 尝试找到解决方案并将其存储在char数组中。
  3. 使用cout输出char数组。

OnlineJudge告诉我代码的执行时间。第一部分花费100毫秒,第二部分花费20毫秒,而第三部分花费12毫秒。因此,如果我想使代码更快,则应该提高输入速度。

OnlineJudge的输入是这样的:

5 2
1 2 3 5 4
Run Code Online (Sandbox Code Playgroud)

第一行是两个整数n和m,第二行是n个由空格分隔的整数。限制为:1 <= n <= 1,600,000和0 <= m <= 1,600,000。为了读取超过一百万个整数,我的代码是这样的:

#include <iostream>
using namespace std;
int main()
{
    std::ios::sync_with_stdio(false);
    cin.tie(NULL);
    int *exit = new int[1600000];
    cin>>n>>m;
    for (int i=0;i<n;++i)
        cin>>exit[i];
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果n小,则OnlineJudge会说执行时间为0毫秒。如果n非常大,例如1,600,000。OnlineJudge说此代码需要100毫秒。如果我删除

std::ios::sync_with_stdio(false);
cin.tie(NULL);
Run Code Online (Sandbox Code Playgroud)

然后代码需要424毫秒。但是,在此作业中必须读取整数,因此我很好奇顶尖的学生如何在52毫秒内完成“ cin,查找解决方案,退出”。

您对提高输入速度有任何想法吗?

2019.4.17?有人建议使用vector或std :: from_chars,但在此分配中这些被禁止。如果我写

#include <vector>
Run Code Online (Sandbox Code Playgroud)

要么

#include <charconv>
Run Code Online (Sandbox Code Playgroud)

要么

#include <array>
Run Code Online (Sandbox Code Playgroud)

然后OnlineJudge说“编译错误”。

有人建议使用scanf,我的代码如下:

for (int i=0;i<n;++i)
    scanf("%d", &exit[i]);
Run Code Online (Sandbox Code Playgroud)

但是执行时间是120毫秒。顺便说一句,我不认为scanf比cin快,在C ++程序中使用scanf()比与cin快?

有人建议使用getline。我很少使用此功能,我的代码如下:

stringstream ss;
string …
Run Code Online (Sandbox Code Playgroud)

c++ input

5
推荐指数
1
解决办法
429
查看次数

标签 统计

c++ ×1

input ×1