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是否为空。代码示例:<