Movatterモバイル変換


[0]ホーム

URL:


HashMap

std::collections::hash_map

StructHashMap 

1.0.0 ·Source
pub struct HashMap<K, V, S =RandomState> {/* private fields */ }
Expand description

Ahash map implemented with quadratic probing and SIMD lookup.

By default,HashMap uses a hashing algorithm selected to provideresistance against HashDoS attacks. The algorithm is randomly seeded, and areasonable best-effort is made to generate this seed from a high quality,secure source of randomness provided by the host without blocking theprogram. Because of this, the randomness of the seed depends on the outputquality of the system’s random number coroutine when the seed is created.In particular, seeds generated when the system’s entropy pool is abnormallylow such as during system boot may be of a lower quality.

The default hashing algorithm is currently SipHash 1-3, though this issubject to change at any point in the future. While its performance is verycompetitive for medium sized keys, other hashing algorithms will outperformit for small keys such as integers as well as large keys such as longstrings, though those algorithms will typicallynot protect againstattacks such as HashDoS.

The hashing algorithm can be replaced on a per-HashMap basis using thedefault,with_hasher, andwith_capacity_and_hasher methods.There are many alternativehashing algorithms available on crates.io.

It is required that the keys implement theEq andHash traits, althoughthis can frequently be achieved by using#[derive(PartialEq, Eq, Hash)].If you implement these yourself, it is important that the followingproperty holds:

k1 == k2 -> hash(k1) == hash(k2)

In other words, if two keys are equal, their hashes must be equal.Violating this property is a logic error.

It is also a logic error for a key to be modified in such a way that the key’shash, as determined by theHash trait, or its equality, as determined bytheEq trait, changes while it is in the map. This is normally onlypossible throughCell,RefCell, global state, I/O, or unsafe code.

The behavior resulting from either logic error is not specified, but willbe encapsulated to theHashMap that observed the logic error and notresult in undefined behavior. This could include panics, incorrect results,aborts, memory leaks, and non-termination.

The hash table implementation is a Rust port of Google’sSwissTable.The original C++ version of SwissTable can be foundhere, and thisCppCon talk gives an overview of how the algorithm works.

§Examples

usestd::collections::HashMap;// Type inference lets us omit an explicit type signature (which// would be `HashMap<String, String>` in this example).letmutbook_reviews = HashMap::new();// Review some books.book_reviews.insert("Adventures of Huckleberry Finn".to_string(),"My favorite book.".to_string(),);book_reviews.insert("Grimms' Fairy Tales".to_string(),"Masterpiece.".to_string(),);book_reviews.insert("Pride and Prejudice".to_string(),"Very enjoyable.".to_string(),);book_reviews.insert("The Adventures of Sherlock Holmes".to_string(),"Eye lyked it alot.".to_string(),);// Check for a specific one.// When collections store owned values (String), they can still be// queried using references (&str).if!book_reviews.contains_key("Les Misérables") {println!("We've got {} reviews, but Les Misérables ain't one.",             book_reviews.len());}// oops, this review has a lot of spelling mistakes, let's delete it.book_reviews.remove("The Adventures of Sherlock Holmes");// Look up the values associated with some keys.letto_find = ["Pride and Prejudice","Alice's Adventure in Wonderland"];for&bookin&to_find {matchbook_reviews.get(book) {Some(review) =>println!("{book}: {review}"),None=>println!("{book} is unreviewed.")    }}// Look up the value for a key (will panic if the key is not found).println!("Review for Jane: {}", book_reviews["Pride and Prejudice"]);// Iterate over everything.for(book, review)in&book_reviews {println!("{book}: \"{review}\"");}

AHashMap with a known list of items can be initialized from an array:

usestd::collections::HashMap;letsolar_distance = HashMap::from([    ("Mercury",0.4),    ("Venus",0.7),    ("Earth",1.0),    ("Mars",1.5),]);

§Entry API

HashMap implements anEntry API, which allowsfor complex methods of getting, setting, updating and removing keys andtheir values:

usestd::collections::HashMap;// type inference lets us omit an explicit type signature (which// would be `HashMap<&str, u8>` in this example).letmutplayer_stats = HashMap::new();fnrandom_stat_buff() -> u8 {// could actually return some random value here - let's just return    // some fixed value for now42}// insert a key only if it doesn't already existplayer_stats.entry("health").or_insert(100);// insert a key using a function that provides a new value only if it// doesn't already existplayer_stats.entry("defence").or_insert_with(random_stat_buff);// update a key, guarding against the key possibly not being setletstat = player_stats.entry("attack").or_insert(100);*stat += random_stat_buff();// modify an entry before an insert with in-place mutationplayer_stats.entry("mana").and_modify(|mana|*mana +=200).or_insert(100);

§Usage with custom key types

The easiest way to useHashMap with a custom key type is to deriveEq andHash.We must also derivePartialEq.

usestd::collections::HashMap;#[derive(Hash, Eq, PartialEq, Debug)]structViking {    name: String,    country: String,}implViking {/// Creates a new Viking.fnnew(name:&str, country:&str) -> Viking {        Viking { name: name.to_string(), country: country.to_string() }    }}// Use a HashMap to store the vikings' health points.letvikings = HashMap::from([    (Viking::new("Einar","Norway"),25),    (Viking::new("Olaf","Denmark"),24),    (Viking::new("Harald","Iceland"),12),]);// Use derived implementation to print the status of the vikings.for(viking, health)in&vikings {println!("{viking:?} has {health} hp");}

§Usage inconst andstatic

As explained above,HashMap is randomly seeded: eachHashMap instance uses a different seed,which means thatHashMap::new normally cannot be used in aconst orstatic initializer.

However, if you need to use aHashMap in aconst orstatic initializer while retainingrandom seed generation, you can wrap theHashMap inLazyLock.

Alternatively, you can construct aHashMap in aconst orstatic initializer using a differenthasher that does not rely on a random seed.Be aware that aHashMap created this way is notresistant to HashDoS attacks!

usestd::collections::HashMap;usestd::hash::{BuildHasherDefault, DefaultHasher};usestd::sync::{LazyLock, Mutex};// HashMaps with a fixed, non-random hasherconstNONRANDOM_EMPTY_MAP: HashMap<String, Vec<i32>, BuildHasherDefault<DefaultHasher>> =    HashMap::with_hasher(BuildHasherDefault::new());staticNONRANDOM_MAP: Mutex<HashMap<String, Vec<i32>, BuildHasherDefault<DefaultHasher>>> =    Mutex::new(HashMap::with_hasher(BuildHasherDefault::new()));// HashMaps using LazyLock to retain random seedingconstRANDOM_EMPTY_MAP: LazyLock<HashMap<String, Vec<i32>>> =    LazyLock::new(HashMap::new);staticRANDOM_MAP: LazyLock<Mutex<HashMap<String, Vec<i32>>>> =    LazyLock::new(|| Mutex::new(HashMap::new()));

Implementations§

Source§

impl<K, V>HashMap<K, V,RandomState>

1.0.0 ·Source

pub fnnew() ->HashMap<K, V,RandomState>

Creates an emptyHashMap.

The hash map is initially created with a capacity of 0, so it will not allocate until itis first inserted into.

§Examples
usestd::collections::HashMap;letmutmap: HashMap<&str, i32> = HashMap::new();
1.0.0 ·Source

pub fnwith_capacity(capacity:usize) ->HashMap<K, V,RandomState>

Creates an emptyHashMap with at least the specified capacity.

The hash map will be able to hold at leastcapacity elements withoutreallocating. This method is allowed to allocate for more elements thancapacity. Ifcapacity is zero, the hash map will not allocate.

§Examples
usestd::collections::HashMap;letmutmap: HashMap<&str, i32> = HashMap::with_capacity(10);
Source§

impl<K, V, S>HashMap<K, V, S>

1.7.0 (const: 1.85.0) ·Source

pub const fnwith_hasher(hash_builder: S) ->HashMap<K, V, S>

Creates an emptyHashMap which will use the given hash builder to hashkeys.

The created map has the default initial capacity.

Warning:hash_builder is normally randomly generated, andis designed to allow HashMaps to be resistant to attacks thatcause many collisions and very poor performance. Setting itmanually using this function can expose a DoS attack vector.

Thehash_builder passed should implement theBuildHasher trait fortheHashMap to be useful, see its documentation for details.

§Examples
usestd::collections::HashMap;usestd::hash::RandomState;lets = RandomState::new();letmutmap = HashMap::with_hasher(s);map.insert(1,2);
1.7.0 ·Source

pub fnwith_capacity_and_hasher(capacity:usize, hasher: S) ->HashMap<K, V, S>

Creates an emptyHashMap with at least the specified capacity, usinghasher to hash the keys.

The hash map will be able to hold at leastcapacity elements withoutreallocating. This method is allowed to allocate for more elements thancapacity. Ifcapacity is zero, the hash map will not allocate.

Warning:hasher is normally randomly generated, andis designed to allow HashMaps to be resistant to attacks thatcause many collisions and very poor performance. Setting itmanually using this function can expose a DoS attack vector.

Thehasher passed should implement theBuildHasher trait fortheHashMap to be useful, see its documentation for details.

§Examples
usestd::collections::HashMap;usestd::hash::RandomState;lets = RandomState::new();letmutmap = HashMap::with_capacity_and_hasher(10, s);map.insert(1,2);
1.0.0 ·Source

pub fncapacity(&self) ->usize

Returns the number of elements the map can hold without reallocating.

This number is a lower bound; theHashMap<K, V> might be able to holdmore, but is guaranteed to be able to hold at least this many.

§Examples
usestd::collections::HashMap;letmap: HashMap<i32, i32> = HashMap::with_capacity(100);assert!(map.capacity() >=100);
1.0.0 ·Source

pub fnkeys(&self) ->Keys<'_, K, V>

An iterator visiting all keys in arbitrary order.The iterator element type is&'a K.

§Examples
usestd::collections::HashMap;letmap = HashMap::from([    ("a",1),    ("b",2),    ("c",3),]);forkeyinmap.keys() {println!("{key}");}
§Performance

In the current implementation, iterating over keys takes O(capacity) timeinstead of O(len) because it internally visits empty buckets too.

1.54.0 ·Source

pub fninto_keys(self) ->IntoKeys<K, V>

Creates a consuming iterator visiting all the keys in arbitrary order.The map cannot be used after calling this.The iterator element type isK.

§Examples
usestd::collections::HashMap;letmap = HashMap::from([    ("a",1),    ("b",2),    ("c",3),]);letmutvec: Vec<&str> = map.into_keys().collect();// The `IntoKeys` iterator produces keys in arbitrary order, so the// keys must be sorted to test them against a sorted array.vec.sort_unstable();assert_eq!(vec, ["a","b","c"]);
§Performance

In the current implementation, iterating over keys takes O(capacity) timeinstead of O(len) because it internally visits empty buckets too.

1.0.0 ·Source

pub fnvalues(&self) ->Values<'_, K, V>

An iterator visiting all values in arbitrary order.The iterator element type is&'a V.

§Examples
usestd::collections::HashMap;letmap = HashMap::from([    ("a",1),    ("b",2),    ("c",3),]);forvalinmap.values() {println!("{val}");}
§Performance

In the current implementation, iterating over values takes O(capacity) timeinstead of O(len) because it internally visits empty buckets too.

1.10.0 ·Source

pub fnvalues_mut(&mut self) ->ValuesMut<'_, K, V>

An iterator visiting all values mutably in arbitrary order.The iterator element type is&'a mut V.

§Examples
usestd::collections::HashMap;letmutmap = HashMap::from([    ("a",1),    ("b",2),    ("c",3),]);forvalinmap.values_mut() {*val =*val +10;}forvalinmap.values() {println!("{val}");}
§Performance

In the current implementation, iterating over values takes O(capacity) timeinstead of O(len) because it internally visits empty buckets too.

1.54.0 ·Source

pub fninto_values(self) ->IntoValues<K, V>

Creates a consuming iterator visiting all the values in arbitrary order.The map cannot be used after calling this.The iterator element type isV.

§Examples
usestd::collections::HashMap;letmap = HashMap::from([    ("a",1),    ("b",2),    ("c",3),]);letmutvec: Vec<i32> = map.into_values().collect();// The `IntoValues` iterator produces values in arbitrary order, so// the values must be sorted to test them against a sorted array.vec.sort_unstable();assert_eq!(vec, [1,2,3]);
§Performance

In the current implementation, iterating over values takes O(capacity) timeinstead of O(len) because it internally visits empty buckets too.

1.0.0 ·Source

pub fniter(&self) ->Iter<'_, K, V>

An iterator visiting all key-value pairs in arbitrary order.The iterator element type is(&'a K, &'a V).

§Examples
usestd::collections::HashMap;letmap = HashMap::from([    ("a",1),    ("b",2),    ("c",3),]);for(key, val)inmap.iter() {println!("key: {key} val: {val}");}
§Performance

In the current implementation, iterating over map takes O(capacity) timeinstead of O(len) because it internally visits empty buckets too.

1.0.0 ·Source

pub fniter_mut(&mut self) ->IterMut<'_, K, V>

An iterator visiting all key-value pairs in arbitrary order,with mutable references to the values.The iterator element type is(&'a K, &'a mut V).

§Examples
usestd::collections::HashMap;letmutmap = HashMap::from([    ("a",1),    ("b",2),    ("c",3),]);// Update all valuesfor(_, val)inmap.iter_mut() {*val*=2;}for(key, val)in&map {println!("key: {key} val: {val}");}
§Performance

In the current implementation, iterating over map takes O(capacity) timeinstead of O(len) because it internally visits empty buckets too.

1.0.0 ·Source

pub fnlen(&self) ->usize

Returns the number of elements in the map.

§Examples
usestd::collections::HashMap;letmuta = HashMap::new();assert_eq!(a.len(),0);a.insert(1,"a");assert_eq!(a.len(),1);
1.0.0 ·Source

pub fnis_empty(&self) ->bool

Returnstrue if the map contains no elements.

§Examples
usestd::collections::HashMap;letmuta = HashMap::new();assert!(a.is_empty());a.insert(1,"a");assert!(!a.is_empty());
1.6.0 ·Source

pub fndrain(&mut self) ->Drain<'_, K, V>

Clears the map, returning all key-value pairs as an iterator. Keeps theallocated memory for reuse.

If the returned iterator is dropped before being fully consumed, itdrops the remaining key-value pairs. The returned iterator keeps amutable borrow on the map to optimize its implementation.

§Examples
usestd::collections::HashMap;letmuta = HashMap::new();a.insert(1,"a");a.insert(2,"b");for(k, v)ina.drain().take(1) {assert!(k ==1|| k ==2);assert!(v =="a"|| v =="b");}assert!(a.is_empty());
1.88.0 ·Source

pub fnextract_if<F>(&mut self, pred: F) ->ExtractIf<'_, K, V, F>
where F:FnMut(&K,&mut V) ->bool,

Creates an iterator which uses a closure to determine if an element (key-value pair) should be removed.

If the closure returnstrue, the element is removed from the map andyielded. If the closure returnsfalse, or panics, the element remainsin the map and will not be yielded.

The iterator also lets you mutate the value of each element in theclosure, regardless of whether you choose to keep or remove it.

If the returnedExtractIf is not exhausted, e.g. because it is dropped without iteratingor the iteration short-circuits, then the remaining elements will be retained.Useretain with a negated predicate if you do not need the returned iterator.

§Examples

Splitting a map into even and odd keys, reusing the original map:

usestd::collections::HashMap;letmutmap: HashMap<i32, i32> = (0..8).map(|x| (x, x)).collect();letextracted: HashMap<i32, i32> = map.extract_if(|k, _v| k %2==0).collect();letmutevens = extracted.keys().copied().collect::<Vec<_>>();letmutodds = map.keys().copied().collect::<Vec<_>>();evens.sort();odds.sort();assert_eq!(evens,vec![0,2,4,6]);assert_eq!(odds,vec![1,3,5,7]);
1.18.0 ·Source

pub fnretain<F>(&mut self, f: F)
where F:FnMut(&K,&mut V) ->bool,

Retains only the elements specified by the predicate.

In other words, remove all pairs(k, v) for whichf(&k, &mut v) returnsfalse.The elements are visited in unsorted (and unspecified) order.

§Examples
usestd::collections::HashMap;letmutmap: HashMap<i32, i32> = (0..8).map(|x| (x, x*10)).collect();map.retain(|&k,_| k %2==0);assert_eq!(map.len(),4);
§Performance

In the current implementation, this operation takes O(capacity) timeinstead of O(len) because it internally visits empty buckets too.

1.0.0 ·Source

pub fnclear(&mut self)

Clears the map, removing all key-value pairs. Keeps the allocated memoryfor reuse.

§Examples
usestd::collections::HashMap;letmuta = HashMap::new();a.insert(1,"a");a.clear();assert!(a.is_empty());
1.9.0 ·Source

pub fnhasher(&self) ->&S

Returns a reference to the map’sBuildHasher.

§Examples
usestd::collections::HashMap;usestd::hash::RandomState;lethasher = RandomState::new();letmap: HashMap<i32, i32> = HashMap::with_hasher(hasher);lethasher:&RandomState = map.hasher();
Source§

impl<K, V, S>HashMap<K, V, S>
where K:Eq +Hash, S:BuildHasher,

1.0.0 ·Source

pub fnreserve(&mut self, additional:usize)

Reserves capacity for at leastadditional more elements to be insertedin theHashMap. The collection may reserve more space to speculativelyavoid frequent reallocations. After callingreserve,capacity will be greater than or equal toself.len() + additional.Does nothing if capacity is already sufficient.

§Panics

Panics if the new allocation size overflowsusize.

§Examples
usestd::collections::HashMap;letmutmap: HashMap<&str, i32> = HashMap::new();map.reserve(10);
1.57.0 ·Source

pub fntry_reserve(&mut self, additional:usize) ->Result<(),TryReserveError>

Tries to reserve capacity for at leastadditional more elements to be insertedin theHashMap. The collection may reserve more space to speculativelyavoid frequent reallocations. After callingtry_reserve,capacity will be greater than or equal toself.len() + additional ifit returnsOk(()).Does nothing if capacity is already sufficient.

§Errors

If the capacity overflows, or the allocator reports a failure, then an erroris returned.

§Examples
usestd::collections::HashMap;letmutmap: HashMap<&str, isize> = HashMap::new();map.try_reserve(10).expect("why is the test harness OOMing on a handful of bytes?");
1.0.0 ·Source

pub fnshrink_to_fit(&mut self)

Shrinks the capacity of the map as much as possible. It will dropdown as much as possible while maintaining the internal rulesand possibly leaving some space in accordance with the resize policy.

§Examples
usestd::collections::HashMap;letmutmap: HashMap<i32, i32> = HashMap::with_capacity(100);map.insert(1,2);map.insert(3,4);assert!(map.capacity() >=100);map.shrink_to_fit();assert!(map.capacity() >=2);
1.56.0 ·Source

pub fnshrink_to(&mut self, min_capacity:usize)

Shrinks the capacity of the map with a lower limit. It will dropdown no lower than the supplied limit while maintaining the internal rulesand possibly leaving some space in accordance with the resize policy.

If the current capacity is less than the lower limit, this is a no-op.

§Examples
usestd::collections::HashMap;letmutmap: HashMap<i32, i32> = HashMap::with_capacity(100);map.insert(1,2);map.insert(3,4);assert!(map.capacity() >=100);map.shrink_to(10);assert!(map.capacity() >=10);map.shrink_to(0);assert!(map.capacity() >=2);
1.0.0 ·Source

pub fnentry(&mut self, key: K) ->Entry<'_, K, V>

Gets the given key’s corresponding entry in the map for in-place manipulation.

§Examples
usestd::collections::HashMap;letmutletters = HashMap::new();forchin"a short treatise on fungi".chars() {    letters.entry(ch).and_modify(|counter|*counter +=1).or_insert(1);}assert_eq!(letters[&'s'],2);assert_eq!(letters[&'t'],3);assert_eq!(letters[&'u'],1);assert_eq!(letters.get(&'y'),None);
1.0.0 ·Source

pub fnget<Q>(&self, k:&Q) ->Option<&V>
where K:Borrow<Q>, Q:Hash +Eq + ?Sized,

Returns a reference to the value corresponding to the key.

The key may be any borrowed form of the map’s key type, butHash andEq on the borrowed formmust match those forthe key type.

§Examples
usestd::collections::HashMap;letmutmap = HashMap::new();map.insert(1,"a");assert_eq!(map.get(&1),Some(&"a"));assert_eq!(map.get(&2),None);
1.40.0 ·Source

pub fnget_key_value<Q>(&self, k:&Q) ->Option<(&K,&V)>
where K:Borrow<Q>, Q:Hash +Eq + ?Sized,

Returns the key-value pair corresponding to the supplied key. This ispotentially useful:

  • for key types where non-identical keys can be considered equal;
  • for getting the&K stored key value from a borrowed&Q lookup key; or
  • for getting a reference to a key with the same lifetime as the collection.

The supplied key may be any borrowed form of the map’s key type, butHash andEq on the borrowed formmust match those forthe key type.

§Examples
usestd::collections::HashMap;usestd::hash::{Hash, Hasher};#[derive(Clone, Copy, Debug)]structS {    id: u32,    name:&'staticstr,// ignored by equality and hashing operations}implPartialEqforS {fneq(&self, other:&S) -> bool {self.id == other.id    }}implEqforS {}implHashforS {fnhash<H: Hasher>(&self, state:&mutH) {self.id.hash(state);    }}letj_a = S { id:1, name:"Jessica"};letj_b = S { id:1, name:"Jess"};letp = S { id:2, name:"Paul"};assert_eq!(j_a, j_b);letmutmap = HashMap::new();map.insert(j_a,"Paris");assert_eq!(map.get_key_value(&j_a),Some((&j_a,&"Paris")));assert_eq!(map.get_key_value(&j_b),Some((&j_a,&"Paris")));// the notable caseassert_eq!(map.get_key_value(&p),None);
1.86.0 ·Source

pub fnget_disjoint_mut<Q, const N:usize>( &mut self, ks: [&Q;N],) -> [Option<&mut V>;N]
where K:Borrow<Q>, Q:Hash +Eq + ?Sized,

Attempts to get mutable references toN values in the map at once.

Returns an array of lengthN with the results of each query. For soundness, at most onemutable reference will be returned to any value.None will be used if the key is missing.

This method performs a check to ensure there are no duplicate keys, which currently has a time-complexity of O(n^2),so be careful when passing many keys.

§Panics

Panics if any keys are overlapping.

§Examples
usestd::collections::HashMap;letmutlibraries = HashMap::new();libraries.insert("Bodleian Library".to_string(),1602);libraries.insert("Athenæum".to_string(),1807);libraries.insert("Herzogin-Anna-Amalia-Bibliothek".to_string(),1691);libraries.insert("Library of Congress".to_string(),1800);// Get Athenæum and Bodleian Librarylet[Some(a),Some(b)] = libraries.get_disjoint_mut(["Athenæum","Bodleian Library",])else{panic!() };// Assert values of Athenæum and Library of Congressletgot = libraries.get_disjoint_mut(["Athenæum","Library of Congress",]);assert_eq!(    got,    [Some(&mut1807),Some(&mut1800),    ],);// Missing keys result in Noneletgot = libraries.get_disjoint_mut(["Athenæum","New York Public Library",]);assert_eq!(    got,    [Some(&mut1807),None]);
usestd::collections::HashMap;letmutlibraries = HashMap::new();libraries.insert("Athenæum".to_string(),1807);// Duplicate keys panic!letgot = libraries.get_disjoint_mut(["Athenæum","Athenæum",]);
1.86.0 ·Source

pub unsafe fnget_disjoint_unchecked_mut<Q, const N:usize>( &mut self, ks: [&Q;N],) -> [Option<&mut V>;N]
where K:Borrow<Q>, Q:Hash +Eq + ?Sized,

Attempts to get mutable references toN values in the map at once, without validating thatthe values are unique.

Returns an array of lengthN with the results of each query.None will be used ifthe key is missing.

For a safe alternative seeget_disjoint_mut.

§Safety

Calling this method with overlapping keys isundefined behavior even if the resultingreferences are not used.

§Examples
usestd::collections::HashMap;letmutlibraries = HashMap::new();libraries.insert("Bodleian Library".to_string(),1602);libraries.insert("Athenæum".to_string(),1807);libraries.insert("Herzogin-Anna-Amalia-Bibliothek".to_string(),1691);libraries.insert("Library of Congress".to_string(),1800);// SAFETY: The keys do not overlap.let[Some(a),Some(b)] = (unsafe{ libraries.get_disjoint_unchecked_mut(["Athenæum","Bodleian Library",]) })else{panic!() };// SAFETY: The keys do not overlap.letgot =unsafe{ libraries.get_disjoint_unchecked_mut(["Athenæum","Library of Congress",]) };assert_eq!(    got,    [Some(&mut1807),Some(&mut1800),    ],);// SAFETY: The keys do not overlap.letgot =unsafe{ libraries.get_disjoint_unchecked_mut(["Athenæum","New York Public Library",]) };// Missing keys result in Noneassert_eq!(got, [Some(&mut1807),None]);
1.0.0 ·Source

pub fncontains_key<Q>(&self, k:&Q) ->bool
where K:Borrow<Q>, Q:Hash +Eq + ?Sized,

Returnstrue if the map contains a value for the specified key.

The key may be any borrowed form of the map’s key type, butHash andEq on the borrowed formmust match those forthe key type.

§Examples
usestd::collections::HashMap;letmutmap = HashMap::new();map.insert(1,"a");assert_eq!(map.contains_key(&1),true);assert_eq!(map.contains_key(&2),false);
1.0.0 ·Source

pub fnget_mut<Q>(&mut self, k:&Q) ->Option<&mut V>
where K:Borrow<Q>, Q:Hash +Eq + ?Sized,

Returns a mutable reference to the value corresponding to the key.

The key may be any borrowed form of the map’s key type, butHash andEq on the borrowed formmust match those forthe key type.

§Examples
usestd::collections::HashMap;letmutmap = HashMap::new();map.insert(1,"a");if letSome(x) = map.get_mut(&1) {*x ="b";}assert_eq!(map[&1],"b");
1.0.0 ·Source

pub fninsert(&mut self, k: K, v: V) ->Option<V>

Inserts a key-value pair into the map.

If the map did not have this key present,None is returned.

If the map did have this key present, the value is updated, and the oldvalue is returned. The key is not updated, though; this matters fortypes that can be== without being identical. See themodule-leveldocumentation for more.

§Examples
usestd::collections::HashMap;letmutmap = HashMap::new();assert_eq!(map.insert(37,"a"),None);assert_eq!(map.is_empty(),false);map.insert(37,"b");assert_eq!(map.insert(37,"c"),Some("b"));assert_eq!(map[&37],"c");
Source

pub fntry_insert( &mut self, key: K, value: V,) ->Result<&mut V,OccupiedError<'_, K, V>>

🔬This is a nightly-only experimental API. (map_try_insert #82766)

Tries to insert a key-value pair into the map, and returnsa mutable reference to the value in the entry.

If the map already had this key present, nothing is updated, andan error containing the occupied entry and the value is returned.

§Examples

Basic usage:

#![feature(map_try_insert)]usestd::collections::HashMap;letmutmap = HashMap::new();assert_eq!(map.try_insert(37,"a").unwrap(),&"a");leterr = map.try_insert(37,"b").unwrap_err();assert_eq!(err.entry.key(),&37);assert_eq!(err.entry.get(),&"a");assert_eq!(err.value,"b");
1.0.0 ·Source

pub fnremove<Q>(&mut self, k:&Q) ->Option<V>
where K:Borrow<Q>, Q:Hash +Eq + ?Sized,

Removes a key from the map, returning the value at the key if the keywas previously in the map.

The key may be any borrowed form of the map’s key type, butHash andEq on the borrowed formmust match those forthe key type.

§Examples
usestd::collections::HashMap;letmutmap = HashMap::new();map.insert(1,"a");assert_eq!(map.remove(&1),Some("a"));assert_eq!(map.remove(&1),None);
1.27.0 ·Source

pub fnremove_entry<Q>(&mut self, k:&Q) ->Option<(K, V)>
where K:Borrow<Q>, Q:Hash +Eq + ?Sized,

Removes a key from the map, returning the stored key and value if thekey was previously in the map.

The key may be any borrowed form of the map’s key type, butHash andEq on the borrowed formmust match those forthe key type.

§Examples
usestd::collections::HashMap;letmutmap = HashMap::new();map.insert(1,"a");assert_eq!(map.remove_entry(&1),Some((1,"a")));assert_eq!(map.remove(&1),None);

Trait Implementations§

1.0.0 ·Source§

impl<K, V, S>Clone forHashMap<K, V, S>
where K:Clone, V:Clone, S:Clone,

Source§

fnclone(&self) -> Self

Returns a duplicate of the value.Read more
Source§

fnclone_from(&mut self, source: &Self)

Performs copy-assignment fromsource.Read more
1.0.0 ·Source§

impl<K, V, S>Debug forHashMap<K, V, S>
where K:Debug, V:Debug,

Source§

fnfmt(&self, f: &mutFormatter<'_>) ->Result

Formats the value using the given formatter.Read more
1.0.0 ·Source§

impl<K, V, S>Default forHashMap<K, V, S>
where S:Default,

Source§

fndefault() ->HashMap<K, V, S>

Creates an emptyHashMap<K, V, S>, with theDefault value for the hasher.

1.4.0 ·Source§

impl<'a, K, V, S>Extend<(&'a K,&'a V)> forHashMap<K, V, S>
where K:Eq +Hash +Copy, V:Copy, S:BuildHasher,

Source§

fnextend<T:IntoIterator<Item = (&'a K,&'a V)>>(&mut self, iter: T)

Extends a collection with the contents of an iterator.Read more
Source§

fnextend_one(&mut self, (k, v): (&'a K,&'a V))

🔬This is a nightly-only experimental API. (extend_one #72631)
Extends a collection with exactly one element.
Source§

fnextend_reserve(&mut self, additional:usize)

🔬This is a nightly-only experimental API. (extend_one #72631)
Reserves capacity in a collection for the given number of additional elements.Read more
1.0.0 ·Source§

impl<K, V, S>Extend<(K, V)> forHashMap<K, V, S>
where K:Eq +Hash, S:BuildHasher,

Inserts all new key-values from the iterator and replaces values with existingkeys with new values returned from the iterator.

Source§

fnextend<T:IntoIterator<Item =(K, V)>>(&mut self, iter: T)

Extends a collection with the contents of an iterator.Read more
Source§

fnextend_one(&mut self, (k, v):(K, V))

🔬This is a nightly-only experimental API. (extend_one #72631)
Extends a collection with exactly one element.
Source§

fnextend_reserve(&mut self, additional:usize)

🔬This is a nightly-only experimental API. (extend_one #72631)
Reserves capacity in a collection for the given number of additional elements.Read more
1.56.0 ·Source§

impl<K, V, const N:usize>From<[(K, V);N]> forHashMap<K, V,RandomState>
where K:Eq +Hash,

Source§

fnfrom(arr: [(K, V);N]) -> Self

Converts a[(K, V); N] into aHashMap<K, V>.

If any entries in the array have equal keys,all but one of the corresponding values will be dropped.

§Examples
usestd::collections::HashMap;letmap1 = HashMap::from([(1,2), (3,4)]);letmap2: HashMap<_,_> = [(1,2), (3,4)].into();assert_eq!(map1, map2);
1.0.0 ·Source§

impl<K, V, S>FromIterator<(K, V)> forHashMap<K, V, S>
where K:Eq +Hash, S:BuildHasher +Default,

Source§

fnfrom_iter<T:IntoIterator<Item =(K, V)>>(iter: T) ->HashMap<K, V, S>

Constructs aHashMap<K, V> from an iterator of key-value pairs.

If the iterator produces any pairs with equal keys,all but one of the corresponding values will be dropped.

1.0.0 ·Source§

impl<K, Q, V, S>Index<&Q> forHashMap<K, V, S>
where K:Eq +Hash +Borrow<Q>, Q:Eq +Hash + ?Sized, S:BuildHasher,

Source§

fnindex(&self, key:&Q) ->&V

Returns a reference to the value corresponding to the supplied key.

§Panics

Panics if the key is not present in theHashMap.

Source§

typeOutput = V

The returned type after indexing.
1.0.0 ·Source§

impl<'a, K, V, S>IntoIterator for &'aHashMap<K, V, S>

Source§

typeItem = (&'a K,&'a V)

The type of the elements being iterated over.
Source§

typeIntoIter =Iter<'a, K, V>

Which kind of iterator are we turning this into?
Source§

fninto_iter(self) ->Iter<'a, K, V>

Creates an iterator from a value.Read more
1.0.0 ·Source§

impl<'a, K, V, S>IntoIterator for &'a mutHashMap<K, V, S>

Source§

typeItem = (&'a K,&'a mut V)

The type of the elements being iterated over.
Source§

typeIntoIter =IterMut<'a, K, V>

Which kind of iterator are we turning this into?
Source§

fninto_iter(self) ->IterMut<'a, K, V>

Creates an iterator from a value.Read more
1.0.0 ·Source§

impl<K, V, S>IntoIterator forHashMap<K, V, S>

Source§

fninto_iter(self) ->IntoIter<K, V>

Creates a consuming iterator, that is, one that moves each key-valuepair out of the map in arbitrary order. The map cannot be used aftercalling this.

§Examples
usestd::collections::HashMap;letmap = HashMap::from([    ("a",1),    ("b",2),    ("c",3),]);// Not possible with .iter()letvec: Vec<(&str, i32)> = map.into_iter().collect();
Source§

typeItem =(K, V)

The type of the elements being iterated over.
Source§

typeIntoIter =IntoIter<K, V>

Which kind of iterator are we turning this into?
1.0.0 ·Source§

impl<K, V, S>PartialEq forHashMap<K, V, S>
where K:Eq +Hash, V:PartialEq, S:BuildHasher,

Source§

fneq(&self, other: &HashMap<K, V, S>) ->bool

Tests forself andother values to be equal, and is used by==.
1.0.0 ·Source§

fnne(&self, other:&Rhs) ->bool

Tests for!=. The default implementation is almost always sufficient,and should not be overridden without very good reason.
1.0.0 ·Source§

impl<K, V, S>Eq forHashMap<K, V, S>
where K:Eq +Hash, V:Eq, S:BuildHasher,

1.36.0 ·Source§

impl<K, V, S>UnwindSafe forHashMap<K, V, S>

Auto Trait Implementations§

§

impl<K, V, S>Freeze forHashMap<K, V, S>
where S:Freeze,

§

impl<K, V, S>RefUnwindSafe forHashMap<K, V, S>

§

impl<K, V, S>Send forHashMap<K, V, S>
where S:Send, K:Send, V:Send,

§

impl<K, V, S>Sync forHashMap<K, V, S>
where S:Sync, K:Sync, V:Sync,

§

impl<K, V, S>Unpin forHashMap<K, V, S>
where S:Unpin, K:Unpin, V:Unpin,

Blanket Implementations§

Source§

impl<T>Any for T
where T: 'static + ?Sized,

Source§

fntype_id(&self) ->TypeId

Gets theTypeId ofself.Read more
Source§

impl<T>Borrow<T> for T
where T: ?Sized,

Source§

fnborrow(&self) ->&T

Immutably borrows from an owned value.Read more
Source§

impl<T>BorrowMut<T> for T
where T: ?Sized,

Source§

fnborrow_mut(&mut self) ->&mut T

Mutably borrows from an owned value.Read more
Source§

impl<T>CloneToUninit for T
where T:Clone,

Source§

unsafe fnclone_to_uninit(&self, dest:*mutu8)

🔬This is a nightly-only experimental API. (clone_to_uninit #126799)
Performs copy-assignment fromself todest.Read more
Source§

impl<T>From<T> for T

Source§

fnfrom(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U>Into<U> for T
where U:From<T>,

Source§

fninto(self) -> U

CallsU::from(self).

That is, this conversion is whatever the implementation ofFrom<T> for U chooses to do.

Source§

impl<T>ToOwned for T
where T:Clone,

Source§

typeOwned = T

The resulting type after obtaining ownership.
Source§

fnto_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning.Read more
Source§

fnclone_into(&self, target:&mut T)

Uses borrowed data to replace owned data, usually by cloning.Read more
Source§

impl<T, U>TryFrom<U> for T
where U:Into<T>,

Source§

typeError =Infallible

The type returned in the event of a conversion error.
Source§

fntry_from(value: U) ->Result<T, <T asTryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U>TryInto<U> for T
where U:TryFrom<T>,

Source§

typeError = <U asTryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fntry_into(self) ->Result<U, <U asTryFrom<T>>::Error>

Performs the conversion.

[8]ページ先頭

©2009-2026 Movatter.jp