2016-10-01 2 views
8

Vec<u8>에서 HashSet<u8>을 빌드하고 싶습니다. 나는 녹에서 벡터로 HashSet 빌드

  • 2n 메모리,

    하지만 내가 얻을 수있는 유일한 일을 사용하여 한 번만 데이터를 복사, 한 줄의 코드에

  • 을이

    1. 을하고 싶습니다 컴파일은이 정크 조각입니다. 나는 데이터를 두 번 복사하고 3n 메모리를 사용한다고 생각합니다.

      fn vec_to_set(vec: Vec<u8>) -> HashSet<u8> { 
          let mut victim = vec.clone(); 
          let x: HashSet<u8> = victim.drain(..).collect(); 
          return x; 
      } 
      

      나는이 같은 간단한 것을 작성하는 기대했다 :

      fn vec_to_set(vec: Vec<u8>) -> HashSet<u8> { 
          return HashSet::from_iter(vec.iter()); 
      } 
      

      을하지만 컴파일되지 않습니다 :

      error[E0308]: mismatched types 
      --> <anon>:5:12 
          | 
      5 |  return HashSet::from_iter(vec.iter()); 
          |   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected u8, found &u8 
          | 
          = note: expected type `std::collections::HashSet<u8>` 
          = note: found type `std::collections::HashSet<&u8, _>` 
      

      을 .. 난 정말 오류를 이해하지 못하는 아마도 RTFM이 필요하기 때문입니다.

  • +1

    코드 및 오류 메시지가 일치하지 않습니다. 'iter()'를 의미해야합니다. – bluss

    +0

    FYI : 첫 번째 코드에서는 벡터를 복제 할 필요가 없습니다. 변경 가능하다고 선언해야합니다. 'let mut victim = vec; '또는 인수 목록에서'fn vec_to_set (mut vec : Vec )'중 하나를 사용하십시오. –

    +4

    * O * 표기법을 올바르게 사용하고 있지 않습니다. _O (n) = O (2n) = O (3n) = O (c * n) _. 요점은 상수가 중요하지 않다는 것입니다. 나는 그것이 당신이 의미하는 것이 분명하다고 생각하지만 아마도 "_2n_ memory"또는 그 대신에 뭔가를 말해야 할 것입니다. – Lii

    답변

    11

    또 다른 대안 : 조작이 vector¹을 소비 할 필요가 없습니다

    때문에, 나는 그것을 을 소비하지한다고 생각합니다. v는 슬라이스를 강제 변환 Vec<u8> 또는 다른 일 hashset(&v) 같은

    use std::collections::HashSet; 
    use std::iter::FromIterator; 
    
    fn hashset(data: &[u8]) -> HashSet<u8> { 
        HashSet::from_iter(data.iter().cloned()) 
    } 
    

    전화를 : 그것은 단지 다른 곳에서 프로그램의 추가 복사로 연결됩니다.

    이 글을 쓰는 방법은 여러 가지가 있지만, 일반적이고 모든 것이지만,이 대답은 내가 집중하고자했던 것을 소개하는 것입니다.

    1 이는 요소 유형 u8Copy이라는 것을 기반으로합니다. 즉 소유권 의미론을 가지고 있지 않습니다.

    11

    다음은 잘 작동합니다. 그것은 당신의 요구 사항을 충족 :

    use std::iter::FromIterator; 
    
    fn vec_to_set(vec: Vec<u8>) -> HashSet<u8> { 
        HashSet::from_iter(vec) 
    } 
    

    from_iter() 작품 IntoIterator를 구현하는 유형에를, 그래서 Vec 인수는 충분하다.

    추가 발언 :

    • 명시 적으로 return 기능 결과에 필요하지 않습니다; 당신은 단지 당신이 사용하는 녹 버전을 잘 모르겠지만, 현재의 안정에 (1.12) to_iter()가 존재하지 않는

    • 몸의 마지막 표현에 세미콜론을 생략 할 필요가