2016-05-31 52 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箱子現在可用。它基於儘可能接近鏡像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箱子提供了一個包含鍵值插入順序的哈希映射。我們可以創建使用()爲值這個哈希地圖一套包裝(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