C++之unordered_multiset容器

unordered_multiset 是 C++ STL (Standard Template Library) 中的一种无序关联容器,类似于 unordered_set,但它允许存储重复的元素。unordered_multiset 使用哈希表(hash table)来存储元素,因此它提供了高效的插入、删除和查找操作。与 multiset 不同的是,unordered_multiset 中的元素是无序的,不保证任何特定的顺序。

主要特点

  1. 允许重复unordered_multiset 容器允许存储重复的元素。
  2. 无序:元素的存储顺序是不确定的,不保证任何特定的顺序。
  3. 高效操作:查找、插入和删除操作的平均时间复杂度为 O(1),但在最坏情况下可能达到 O(n)。
  4. 哈希表实现:内部使用哈希表来存储元素。

常用操作

定义和初始化
#include <unordered_set>

std::unordered_multiset<int> ums; // 创建一个空的 unordered_multiset 容器
std::unordered_multiset<int> ums = {1, 2, 2, 3, 3, 3}; // 初始化 unordered_multiset 容器
插入元素
ums.insert(5); // 插入单个元素
ums.insert({6, 6, 7}); // 插入多个元素
删除元素
ums.erase(5); // 删除值为 5 的所有元素
ums.erase(ums.begin()); // 删除第一个元素
查找元素
auto it = ums.find(3); // 查找值为 3 的一个元素,返回指向该元素的迭代器,如果找不到则返回 end()
if (it != ums.end()) {
    std::cout << "Found " << *it << std::endl;
} else {
    std::cout << "Not found" << std::endl;
}
计算特定值的元素数量
size_t count = ums.count(3); // 计算值为 3 的元素数量
std::cout << "There are " << count << " elements with value 3." << std::endl;
获取元素数量
std::cout << "The unordered_multiset has " << ums.size() << " elements." << std::endl;
清空容器
ums.clear(); // 清空 unordered_multiset 容器
遍历容器
for (const auto& elem : ums) {
    std::cout << elem << " ";
}
// 或者使用迭代器
for (auto it = ums.begin(); it != ums.end(); ++it) {
    std::cout << *it << " ";
}

自定义哈希函数和相等函数

如果你存储的元素类型不是内置类型,或者你希望使用不同的哈希函数和相等函数,可以自定义它们。例如,假设你有一个自定义的结构体:

#include <unordered_set>
#include <string>

struct Person {
    std::string name;
    int age;

    bool operator==(const Person& other) const {
        return name == other.name && age == other.age;
    }
};

struct PersonHash {
    std::size_t operator()(const Person& p) const {
        std::hash<std::string> stringHash;
        std::hash<int> intHash;
        return stringHash(p.name) ^ intHash(p.age);
    }
};

struct PersonEqual {
    bool operator()(const Person& p1, const Person& p2) const {
        return p1 == p2;
    }
};

int main() {
    std::unordered_multiset<Person, PersonHash, PersonEqual> people;
    people.insert({"Alice", 30});
    people.insert({"Alice", 30});
    people.insert({"Bob", 25});

    for (const auto& person : people) {
        std::cout << person.name << ", " << person.age << std::endl;
    }

    return 0;
}

总结

unordered_multiset 是一个非常有用的数据结构,当你需要存储重复且不需要排序的元素时,它是一个很好的选择。由于它的内部实现,unordered_multiset 提供了高效的插入、删除和查找操作。与 multiset 相比,unordered_multiset 在查找速度上通常更快,但不保证元素的顺序。这使得 unordered_multiset 在处理大量数据时特别有用,特别是在性能要求较高的场景中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值