Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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
Sorting 如何检查切片是否已排序?_Sorting_Iterator_Rust_Slice - Fatal编程技术网

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),
    }
}