2016-05-31 21 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クレートが入手可能です。これは、 linked-hash-mapベースのstd HashSet APIを可能な限り密接に反映しています。

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は、キー値の挿入順序を保持するハッシュマップを提供します。我々は(std::collections::HashSetがこのように実装されている)の値として()を使用して、このハッシュマップの設定ラッパーを作成することができます

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

あなたが他のメソッドを実装することができます。 LinkedHashMapdocsを参照してください。

関連する問題