从控制台C++读取随机整数的更快方法

Faster way to read random number of integers from console C++

本文关键字:方法 整数 随机 控制台 C++ 读取      更新时间:2023-10-16


首先,我想说,C++不是我的基本语言,如果它是基本知识,我请求原谅
我的问题是,我必须用我的算法克服spoj时间限制。我相信算法本身是好的(我不想得到帮助;),但传递给它的数据是从控制台提供的
我需要读取以EOF符号结尾的单行中的随机整数(限制为10^7)。到目前为止,我得到了这样的东西:

cin.tie(NULL);
std::ios::sync_with_stdio(false);
vector <unsigned int > vector_of_int;
...
std::string str;
std::getline(std::cin, str);
std::istringstream sstr(str);
unsigned int n;
while(sstr >> n){
    vector_of_int.push_back(n); 
}

然而,这还不够快,无法满足此任务的时间限制。所以问题是,有没有更快(对spoj友好)的方法来读取这种数据?

我的结果是

number      status  signal  time    memory
test 0      passed  OK      0.0s    2828KB
test 1      passed  OK      0.0s    2828KB
test 2      passed  OK      0.01s   2828KB
test 3      passed  OK      0.0s    2828KB
test 4      passed  OK      0.01s   2828KB
test 5      passed  OK      0.0s    2828KB
test 6      passed  OK      0.0s    2940KB
test 7      passed  OK      0.04s   3060KB
test 8      passed  OK      0.24s   3452KB
test 9      passed  OK      0.44s   3452KB
test 10     passed  OK      0.84s   3452KB
test 11     TLE     OK      1.01s   27784KB
test 12     TLE     OK      1.01s   28056KB



编辑:
评论vector_of_int.push_back(n);行后的结果

number  status          signal  time    memory
test 0  passed          OK      0.0s    2828KB
test 1  wrong answer    OK      0.0s    2828KB
test 2  wrong answer    OK      0.0s    2828KB
test 3  wrong answer    OK      0.0s    2828KB
test 4  wrong answer    OK      0.0s    2828KB
test 5  wrong answer    OK      0.0s    2828KB
test 6  wrong answer    OK      0.01s   2964KB
test 7  runtime error   SIGSEGV 0.02s   3128KB
test 8  runtime error   SIGSEGV 0.06s   5504KB
test 9  runtime error   SIGSEGV 0.09s   8032KB
test 10 runtime error   SIGSEGV 0.16s   13224KB
test 11 runtime error   SIGSEGV 0.21s   14976KB
test 12 runtime error   SIGSEGV 0.28s   23440KB



第2版:
我注意到输入行由EOF终止,而不是由新行终止。

给定结果数据,我相信你可以通过包括线来达到目标

vector_of_int.reserve(1e7);

在调用任何push_back之前。

这一行告诉vector保留用于接收至少1e7元素的存储器。这将阻止当前似乎正在发生的任何内存重新分配。1e7在您的问题中被明确记录为上限。

我找到了解决方案

vector <int> vector_of_int;
vector_of_int.reserve(1e7);
char ch;
int i = 0;
int acc = 0, buf;
while( (ch=getchar()) > 0 ){
    if(ch!=' ') {
        acc = acc * 10 + ch - '0';
    } else {
        vector_of_int.push_back(acc);
        acc = 0;
    }
}

它给了我下面列出的结果

number  status  signal  time    memory
test 0  passed  OK      0.0s    2688KB
test 1  passed  OK      0.01s   2688KB
test 2  passed  OK      0.01s   2688KB
test 3  passed  OK      0.01s   2688KB
test 4  passed  OK      0.01s   2688KB
test 5  passed  OK      0.01s   2688KB
test 6  passed  OK      0.01s   2688KB
test 7  passed  OK      0.01s   2688KB
test 8  passed  OK      0.12s   2688KB
test 9  passed  OK      0.23s   2688KB
test 10 passed  OK      0.46s   2688KB
test 11 passed  OK      0.63s   2688KB
test 12 passed  OK      0.86s   2688KB

我没有改变算法中的任何一行,所以这就成功了。