Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String Rust编程竞赛中最快的惯用I/O例程?_String_Parsing_Optimization_Rust - Fatal编程技术网

String Rust编程竞赛中最快的惯用I/O例程?

String Rust编程竞赛中最快的惯用I/O例程?,string,parsing,optimization,rust,String,Parsing,Optimization,Rust,我的问题已经得到了部分回答,所以我修改了它,以回应我从评论和其他实验中学到的东西 总之,我想要一个用于编程竞赛的快速I/O例程,在该例程中,问题可以用单个文件解决,而无需外部机箱。它应该从BufRead(stdin或文件)读取一系列空格分隔的标记。标记可以是整数、浮点数或ASCII字,由空格和换行符分隔,因此我似乎应该一般支持FromStr类型。一小部分问题是交互式的,这意味着最初并不是所有的输入都可用,但总是以完整的行出现 以下是上下文。有人编写了非常快速的自定义代码,直接从BufRead::

我的问题已经得到了部分回答,所以我修改了它,以回应我从评论和其他实验中学到的东西

总之,我想要一个用于编程竞赛的快速I/O例程,在该例程中,问题可以用单个文件解决,而无需外部机箱。它应该从
BufRead
(stdin或文件)读取一系列空格分隔的标记。标记可以是整数、浮点数或ASCII字,由空格和换行符分隔,因此我似乎应该一般支持
FromStr
类型。一小部分问题是交互式的,这意味着最初并不是所有的输入都可用,但总是以完整的行出现

以下是上下文。有人编写了非常快速的自定义代码,直接从
BufRead::fill_buf()
和[u8]
输出解析整数,但它在
FromStr
中不是通用的

以下是我的(重点是
扫描仪
结构):

使用std::io:{self,prelude::*};
fn解算(mut扫描:扫描仪,mut w:w){
设n=scan.token();
设mut a=Vec::具有_容量(n);
设mut b=Vec::具有_容量(n);
对于0..n中的uu{
a、 推送(扫描令牌::());
b、 推送(扫描令牌::());
}
让mut排序:Vec=(0..n).collect();
order.sort_by_key(|&i|b[i]-a[i]);
让ans:i64=顺序
.into_iter()
.enumerate()
.map(|(i,x)| a[x]*i作为i64+b[x]*(n-1-i)作为i64)
.sum();
写!(w,“{}”,ans);
}
fn main(){
设stdin=io::stdin();
设stdout=io::stdout();
让reader=Scanner::new(stdin.lock());
让writer=io::BufWriter::new(stdout.lock());
解决(读者、作者);
}
发布结构扫描程序{
读者:B,
buf_街:字符串,

buf_iter:std::str::SplitWhitespace我很高兴你这么问,因为我在我的LibCodeJam-rust实现中解决了这个问题。具体地说,从
BufRead
读取原始令牌由以及一些小的相关助手处理

以下是相关摘录。这里的基本思想是扫描
BufRead::fill_buf
缓冲区中的空白,并将非空白字符复制到本地缓冲区中,在令牌调用之间重复使用。一旦找到空白字符或流结束,本地缓冲区将被解释为UTF-8并作为
&str

#[派生(调试)]
发布枚举加载错误{
Io(Io::错误),
Utf8Error(Utf8Error),
偶尔,
}
///TokenBuffer是一个可恢复的缓冲区,可将令牌放入其中
///一个接一个地读入。它已清除但未解除分配
///在每个标记之间。
#[导出(调试)]
结构令牌缓冲区(Vec);
impl令牌缓冲区{
///清除缓冲区并开始读取新令牌
fn lock(&mut self)->TokenBufferLock{
self.0.clear();
TokenBufferLock(&mut self.0)
}
}
///TokenBufferLock是帮助管理生命周期的帮助器类型
///读取新标记,然后将其解释为UTF-8。
#[派生(调试,默认)]
结构令牌缓冲锁{
///向令牌添加一些字节
fn扩展(&mut self,chunk:&u8]){
self.0.extend(块)
}
///完成标记并尝试将其解释为UTF-8

fn完成(自我)->ResultI我猜这是必须的-不要猜测,profile。profiler怎么说?如果您非常关心运行时性能,显然您将使用profiler,是吗?使用额外的
字符串
Vec
分配,以及UTF-8验证-这些都与
FromStr
无关。如果您从一个静态字符串开始,很可能您的实现也会一样快。对,我不是责备
FromStr
。相反,考虑到i64的
impl FromStr遵从
as_bytes()
表示无论如何,我觉得这必须能够有效地完成。这可能只是找到一种更有效的方法从
BufRead
获取令牌的问题。不过你说得对,我应该使用分析器进行一些练习……我对生锈几乎一无所知,但我不喜欢程序在UNEP上进入无休止的循环我也喜欢C++中的“<代码> CIN > x<代码> >或代码>(f)Sncf(..)。我考虑是否可以重写TeXiIO:::读入适合编程竞赛的短片段。