Skip to content

Document replacement behavior of map and set insertion methods #26888

@apasel422

Description

@apasel422

The behavior of the following methods is undocumented when the key/item being inserted is equivalent to one already in the collection:

The following program demonstrates that the maps and sets do not replace their keys/items in this scenario:

use std::cmp::Ordering;
use std::collections::{BTreeMap, BTreeSet, HashMap, HashSet};
use std::hash::{Hash, Hasher};

#[derive(Debug)]
struct Foo {
    a: u32,
    b: &'static str,
}

impl PartialEq for Foo {
    fn eq(&self, other: &Self) -> bool { self.a == other.a }
}

impl Eq for Foo {}

impl Hash for Foo {
    fn hash<H: Hasher>(&self, h: &mut H) { self.a.hash(h); }
}

impl PartialOrd for Foo {
    fn partial_cmp(&self, other: &Self) -> Option<Ordering> { self.a.partial_cmp(&other.a) }
}

impl Ord for Foo {
    fn cmp(&self, other: &Self) -> Ordering { self.a.cmp(&other.a) }
}

fn main() {
    println!("BTreeMap:");
    let mut map = BTreeMap::new();
    map.insert(Foo { a: 1, b: "baz" }, ());
    map.insert(Foo { a: 1, b: "xyz" }, ());
    for foo in map.keys() { println!("{:?}", foo); }

    println!("HashMap:");
    let mut map = HashMap::new();
    map.insert(Foo { a: 1, b: "baz" }, ());
    map.insert(Foo { a: 1, b: "xyz" }, ());
    for foo in map.keys() { println!("{:?}", foo); }

    println!("BTreeSet:");
    let mut set = BTreeSet::new();
    set.insert(Foo { a: 1, b: "baz" });
    set.insert(Foo { a: 1, b: "xyz" });
    for foo in &set { println!("{:?}", foo); }

    println!("HashSet:");
    let mut set = HashSet::new();
    set.insert(Foo { a: 1, b: "baz" });
    set.insert(Foo { a: 1, b: "xyz" });
    for foo in &set { println!("{:?}", foo); }
}

Output:

BTreeMap:
Foo { a: 1, b: "baz" }
HashMap:
Foo { a: 1, b: "baz" }
BTreeSet:
Foo { a: 1, b: "baz" }
HashSet:
Foo { a: 1, b: "baz" }

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions