Sorting 如何检查切片是否已排序?
如何检查切片是否已排序Sorting 如何检查切片是否已排序?,sorting,iterator,rust,slice,Sorting,Iterator,Rust,Slice,如何检查切片是否已排序 fn is_sorted(data: &[i32]) -> bool { // ... } 假设一个函数接受一个i32切片,是否有一种惯用的方法来检查切片是否已排序 fn is_sorted(data: &[i32]) -> bool { // ... } 是否有可能推广上述方法,使其接受迭代器 fn is_sorted<I>(iter: I) where I: Iterator, I::It
fn is_sorted(data: &[i32]) -> bool {
// ...
}
假设一个函数接受一个i32
切片,是否有一种惯用的方法来检查切片是否已排序
fn is_sorted(data: &[i32]) -> bool {
// ...
}
是否有可能推广上述方法,使其接受迭代器
fn is_sorted<I>(iter: I)
where
I: Iterator,
I::Item: Ord,
{
// ...
}
fn已排序(iter:I)
哪里
I:迭代器,
一:项目:作战需求文件,
{
// ...
}
我会抓取成对的元素,并断言它们都是升序(或降序,取决于“排序”的含义):
fn已排序(数据:&[T])->bool
哪里
T:Ord,
{
data.windows(2).all(| w | w[0]bool
哪里
I:迭代器,
I::项目:作战需求文件+克隆,
{
data.into_iter().tuple_windows().all(|(a,b)| a对于迭代器是排序的实现,不需要进行克隆
fn is_sorted<I>(data: I) -> bool
where
I: IntoIterator,
I::Item: Ord,
{
let mut it = data.into_iter();
match it.next() {
None => true,
Some(first) => it.scan(first, |state, next| {
let cmp = *state <= next;
*state = next;
Some(cmp)
}).all(|b| b),
}
}
fn已排序(数据:I)->bool
哪里
I:迭代器,
一:项目:作战需求文件,
{
让mut it=data.into_iter();
匹配它。下一个(){
无=>正确,
Some(first)=>it.scan(first,| state,next |{
让cmp=*声明测试每个后续元素是否始终大于或小于前一个元素?为了记录,当前有一个RFC用于将添加到标准库中。@PeterHall I dunno;通常,要么按结构对集合进行排序(例如,始终在“正确”位置添加新值)或者通过某种类型不变量(例如,BTreeSet
)。您是否想检查某个内容是否已排序?:-D此外,您必须处理哪个“排序”是指,然后按键排序,等等。@Shepmaster“您是否想检查某个内容是否已排序?”——事实上,经常是:单元测试和前后条件检查。;-)我发现很明显,这需要一个(总的)顺序,而不是一个部分顺序。从来没有想过这一点。
fn is_sorted<I>(data: I) -> bool
where
I: IntoIterator,
I::Item: Ord,
{
let mut it = data.into_iter();
match it.next() {
None => true,
Some(first) => it.scan(first, |state, next| {
let cmp = *state <= next;
*state = next;
Some(cmp)
}).all(|b| b),
}
}