容器库(8)-std::multiset

本文详细介绍了C++标准库中的std::multiset容器,包括其特性(允许重复key),构造、析构、赋值、迭代器使用、容量操作、修改器(如insert、erase、swap)以及查找功能(count、find、lower_bound、upper_bound)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

std::multiset是以key为元素的有序关联容器,和std::set不同的是,std::multiset中的key可以重复。搜索、移除和插入的时间复杂度是对数复杂度。

template<
    class Key,
    class Compare = std::less<Key>,
    class Allocator = std::allocator<Key>
> class multiset;

本文章的代码库:

https://gitee.com/gamestorm577/CppStd

成员函数

构造、析构和赋值

构造函数

可以用迭代器、另一个multiset或者元素列表来构造一个multiset。代码示例:

std::vector<int> vec{1, 1, 2, 2, 3};

std::multiset<int> m1(vec.begin(), vec.end());
std::multiset<int> m2(m1);
std::multiset<int> m3{1, 2, 2, 2, 2, 3, 3, 4};

std::cout << "m1 size = " << m1.size() << std::endl;
std::cout << "m2 size = " << m2.size() << std::endl;
std::cout << "m3 size = " << m3.size() << std::endl;

输出结果:

m1 size = 5
m2 size = 5
m3 size = 8

析构函数

删除multiset时,会调用各元素的析构函数。代码示例:

struct MyStruct
{
    MyStruct(int i)
        : Index(i)
    {
    }

    ~MyStruct()
    {
        std::cout << "destruct, Index = " << Index << std::endl;
    }

    int Index = 0;
};

struct MyStructCmp
{
    bool operator()(const MyStruct& lhs, const MyStruct& rhs) const
    {
        return lhs.Index < rhs.Index;
    }
};

std::multiset<MyStruct, MyStructCmp> s{1, 2, 2, 3};
std::cout << "end" << std::endl;

输出结果:

destruct, Index = 3
destruct, Index = 2
destruct, Index = 2
destruct, Index = 1
end
destruct, Index = 1
destruct, Index = 3
destruct, Index = 2
destruct, Index = 2

赋值函数

可以用另一个set或者元素列表给set赋值。代码示例:

std::multiset<int> tmp{1, 1, 2, 2};
std::multiset<int> m1;
std::multiset<int> m2;

m1 = tmp;
m2 = {1, 1, 2, 2, 3};
std::cout << "m1 size = " << m1.size() << std::endl;
std::cout << "m2 size = " << m2.size() << std::endl;

输出结果:

m1 size = 4
m2 size = 5

迭代器

接口begin、cbegin指向multiset起始的迭代器,end、cend指向末尾的迭代器。rbegin、crbegin指向起始的逆向迭代器,rend、crend指向末尾的逆向迭代器。无论什么迭代器都不能修改元素的值。代码示例:

std::multiset<int> m{1, 2, 2, 3};
for (auto iter = m.begin(); iter != m.end(); ++iter)
{
    std::cout << "num is: " << *iter << std::endl;
}

输出结果:

num is: 1
num is: 2
num is: 2
num is: 3

容量

empty

检查multiset是否为空。代码示例:<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lucy_stone

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值