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

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


首先我想说,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);

在调用 any 之前 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

我没有更改算法中的一行,所以成功了。