从控制台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);
在调用任何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++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 让bool方法返回其他整数
- 有没有一种优雅而快速的方法来测试整数中的 1 位是否位于连续区域
- 将一系列整数放入类的最佳方法是什么?
- 比较C++中两个整数的最有效和最干净的方法是什么?
- 在 C++ 中将整数数组转换为位集表示形式的最佳方法?
- 有没有更好的方法对C++中的三个整数进行排序?
- 使用192/256位整数求和无符号64位整数向量的点积的最快方法
- 初始化不是整数的巨大常量多维数组的最佳方法是什么?
- 在C++中,将无符号整数转换为八进制表示,反之亦然的最佳方法是什么
- C++:这是使用整数变量作为函数调用指针的正确方法吗
- 计算将整数n分解为4平方和的方法的数量
- 计算机使用什么方法添加无符号整数
- 基于整数向量执行位排列的有效方法?
- 快速方法可以将整数乘以适当的分数,而无需浮点或溢出
- 为大无符号整数分配内存的有效方法
- 在模型中保存整数的方法,与QStyledItemDelegate兼容
- 将整数输入数组的方法比 scanf() 或 cin 更快?
- 如何将枚举传递给方法而不将其作为整数传递
- 获取两个无符号整数 C++ 乘积的高 32 位的有效方法