2016-05-31 1 views
1

삽입 순서를 유지하는 (Vec을 생각하는) 고유 한 값만 추적하는 유형 (HashSet을 생각해 보라)이 있습니까? 삽입 전에 값이 존재하는지 먼저 확인해야하기 때문에 Vec을 사용하지 않는 것이 좋습니다.삽입 순서를 유지하는 집합 유형

+1

[linked-hash-map] (https://crates.io/crates/linked-hash-map) 상자를 보았습니까? 어쩌면'V =()'로 랩을 만들 수 있습니다. – malbarbo

+1

기본적으로 세트로 사용되는 http://stackoverflow.com/q/30243100/155423의 복제본은 가치가없는 단지지도입니다. – Shepmaster

+0

필요한 변경 사항은 요소 추가 및 요소 복사 만 가능한 경우 집합 및 벡터를 모두 사용하고 중복 검사에 대한 집합 및 요소를 순서대로 저장하는 벡터를 사용하면됩니다. – CodesInChaos

답변

1

linked_hash_set 크레이트가 현재 제공됩니다. 가능한 한 가깝게 HashSet API를 미러링하여 linked-hash-map을 기반으로합니다.

extern crate linked_hash_set; 
use linked_hash_set::LinkedHashSet; 

let mut set = LinkedHashSet::new(); 
set.insert(234); 
set.insert(123); 
set.insert(345); 
set.insert(123); 

assert_eq!(set.into_iter().collect::<Vec<_>>(), vec![234, 345, 123]); 
3

linked-hash-map crate는 키 - 값 삽입 순서를 유지하는 해시 맵을 제공합니다.

extern crate linked_hash_map; 

use linked_hash_map::*; 
use std::collections::hash_map::RandomState; 
use std::hash::{BuildHasher, Hash}; 
use std::borrow::Borrow; 

fn main() { 
    let mut s = LinkedHashSet::new(); 
    s.insert(5); 
    s.insert(3); 
    s.insert(7); 
    s.insert(1); 
    assert_eq!(vec![5, 3, 7, 1], s.iter().cloned().collect::<Vec<_>>()); 
    s.remove(&7); 
    assert_eq!(vec![5, 3, 1], s.iter().cloned().collect::<Vec<_>>()); 
    s.remove(&5); 
    assert_eq!(vec![3, 1], s.iter().cloned().collect::<Vec<_>>()); 
} 

pub struct LinkedHashSet<K, S = RandomState>(LinkedHashMap<K,(), S>); 

impl<K: Hash + Eq> LinkedHashSet<K> { 
    pub fn new() -> Self { 
     LinkedHashSet(LinkedHashMap::new()) 
    } 
} 

impl<K: Hash + Eq, S: BuildHasher> LinkedHashSet<K, S> { 
    pub fn insert(&mut self, k: K) -> Option<()> { 
     self.0.insert(k,()) 
    } 

    pub fn contains<Q: ?Sized>(&self, k: &Q) -> bool 
     where K: Borrow<Q>, 
       Q: Eq + Hash 
    { 
     self.0.contains_key(k) 
    } 

    pub fn remove<Q: ?Sized>(&mut self, k: &Q) -> Option<()> 
     where K: Borrow<Q>, 
       Q: Eq + Hash 
    { 
     self.0.remove(k) 
    } 

    pub fn iter(&self) -> Keys<K,()> { 
     self.0.keys() 
    } 
} 

당신은 다른 방법을 구현할 수 있습니다 : 우리는 값으로 ()를 사용하여이 해시 맵에 대한 일련의 래퍼 (std::collections::HashSet이 방법을 구현) 만들 수 있습니다. LinkedHashMapdocs을 참조하십시오.

관련 문제