2016-08-08 5 views
4

표준 라이브러리는 구분 기호와 같은 유형의 다른 슬라이스를 사용하여 슬라이스 [T]을 분할하는 방법을 제공합니까? 라이브러리 설명서에는 슬라이스가 아닌 단일 요소 구분 기호로 작동하는 메서드가 나열되어 있습니다. 예를 들어다른 슬라이스를 구분 기호로 사용하여 분할 영역을 분할하는 방법은 무엇입니까?

: 구분 두 조각과 [1u64, 4u64][8u64] 초래 [0u64, 0u64]로를 이용하여 분할 [1u64, 4u64, 0u64, 0u64, 8u64] 5 개 u64 정수 조각.

답변

3

표준 라이브러리는 구분 기호와 같은 유형의 다른 조각을 사용하여 [T] 슬라이스를 분할하는 방법을 제공합니까? 녹 1.9, 아니 현재로

,하지만 당신은 그것을 구현할 수 있습니다 :이 구현은 동일한 서브를 찾기위한 naive 알고리즘을 사용하는

fn main() { 
    let a = [1, 4, 7, 0, 0, 8, 10, 0, 0]; 
    let b = [0, 0]; 
    let mut iter = split_subsequence(&a, &b); 
    assert_eq!(&[1, 4, 7], iter.next().unwrap()); 
    assert_eq!(&[8, 10], iter.next().unwrap()); 
    assert!(iter.next().unwrap().is_empty()); 
    assert_eq!(None, iter.next()); 
} 

pub struct SplitSubsequence<'a, 'b, T: 'a + 'b> { 
    slice: &'a [T], 
    needle: &'b [T], 
    ended: bool, 
} 

impl<'a, 'b, T: 'a + 'b + PartialEq> Iterator for SplitSubsequence<'a, 'b, T> { 
    type Item = &'a [T]; 

    fn next(&mut self) -> Option<Self::Item> { 
     if self.ended { 
      None 
     } else if self.slice.is_empty() { 
      self.ended = true; 
      Some(self.slice) 
     } else if let Some(p) = self.slice 
            .windows(self.needle.len()) 
            .position(|w| w == self.needle) { 
      let item = &self.slice[..p]; 
      self.slice = &self.slice[p + self.needle.len()..]; 
      Some(item) 
     } else { 
      let item = self.slice; 
      self.slice = &self.slice[self.slice.len() - 1..]; 
      Some(item) 
     } 
    } 
} 

fn split_subsequence<'a, 'b, T>(slice: &'a [T], needle: &'b [T]) -> SplitSubsequence<'a, 'b, T> 
    where T: 'a + 'b + PartialEq 
{ 
    SplitSubsequence { 
     slice: slice, 
     needle: needle, 
     ended: false, 
    } 
} 

참고.

+0

naive 알고리즘은 O (n^2)입니다. 표준 라이브러리에 포함되지 않은 이유 중 일부입니다. – Shepmaster

+0

그게 내가 끝내 준거야. 구현에 대한 응답을 설명하기 위해 시간을내어 +1하십시오. – Doe

관련 문제