rust - 在 C++ 的`std::cin >>` 的 Rust 模拟中,我缺少什么极端情况?
问题描述
我的计划是编写一个简单的方法,该方法完全符合std::cin >>
C++ 标准库的功能:
use std::io::BufRead;
pub fn input<T: std::str::FromStr>(handle: &std::io::Stdin) -> Result<T, T::Err> {
let mut x = String::new();
let mut guard = handle.lock();
loop {
let mut trimmed = false;
let available = guard.fill_buf().unwrap();
let l = match available.iter().position(|&b| !(b as char).is_whitespace()) {
Some(i) => {
trimmed = true;
i
}
None => available.len(),
};
guard.consume(l);
if trimmed {
break;
}
}
let available = guard.fill_buf().unwrap();
let l = match available.iter().position(|&b| (b as char).is_whitespace()) {
Some(i) => i,
None => available.len(),
};
x.push_str(std::str::from_utf8(&available[..l]).unwrap());
guard.consume(l);
T::from_str(&x)
}
这loop
意味着在有效输入开始之前修剪掉所有空白。循环外的match
块是计算有效输入长度的地方(即,在尾随空格开始或EOF
到达之前)。
这是使用上述方法的示例。
let handle = std::io::stdin();
let x: i32 = input(&handle).unwrap();
println!("x: {}", x);
let y: String = input(&handle).unwrap();
println!("y: {}", y);
当我尝试了一些简单的测试时,该方法按预期工作。但是,当我在 codeforces 等在线编程判断中使用它时,我收到一条抱怨,告诉我程序有时会保持空闲状态或输入错误,以及其他问题,这导致怀疑我错过了一个极端情况或类似的东西。这通常发生在输入有几百行长的时候。
什么输入会破坏方法?修正是什么?
解决方案
经过大量实验后,我注意到读取每个输入时都会出现延迟,随着输入数量的增加而增加。该函数不使用缓冲区。每次需要填充变量时,它都会尝试访问流,这很慢,因此会出现滞后。
经验教训:始终使用容量大的缓冲区。
但是,闲置问题仍然存在,直到我将fill_buf
,consume
对替换为类似的东西read_line
or read_string
。
推荐阅读
- highcharts - Highcharts - 基于条形宽度的条形之间的空间
- postgresql - PG::ConnectionBad 连接被拒绝
- reactjs - 遵守 react-hooks/exhaustive-deps 会导致无限循环和/或大量 useCallback()
- java - 外部化 Spring Boot 资源的问题
- c# - WPF UserControl 在 WPF 应用程序中工作,但在带有 ElementHost 的 Winforms 应用程序中使用 BindingSource,永远不会调用 setter
- c++ - 如何从年、月、日、小时、分钟、秒、毫秒中获取计时时间点?
- java - Guice:使用带有自己参数的构造函数注入类?
- python - 如何在 Python 中获取和使用 RGB 值?
- azure-pipelines - 如何在构建期间将 Azure Pipelines 中的变量应用于节点应用
- java - 从 JsonObject 中删除元素