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

时间:2015-03-25 10:08:11

标签: c++ console iostream


首先我要说的是,C ++不是我的基本语言,如果它是基础知识,我会请求宽恕。
我的问题是我必须用我的算法克服时间限制。我确信算法本身是好的(我不想要它的帮助;)),但传递给它的数据是从控制台给出的。
我需要在由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); 
}

但是 - 这还不足以适应此任务的时间限制。所以问题是 - 有没有更快(欺骗友好)的方式来阅读这种数据?

我的结果是

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而不是新行终止的。

2 个答案:

答案 0 :(得分:1)

鉴于结果数据,我相信你可以通过加入

来达到目标

vector_of_int.reserve(1e7);

在致电任何 push_back

之前

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

答案 1 :(得分:0)

我找到了解决方案!

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

我没有更改算法中的单行,所以这就成了伎俩。