从控制台 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
我没有更改算法中的一行,所以成功了。
首先我想说,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
我没有更改算法中的一行,所以成功了。