公有成员函数
<set>

std::multiset::multiset

empty (1)
explicit multiset (const key_compare& comp = key_compare(),                   const allocator_type& alloc = allocator_type());
range (2)
template <class InputIterator>  multiset (InputIterator first, InputIterator last,            const key_compare& comp = key_compare(),            const allocator_type& alloc = allocator_type());
copy (3)
multiset (const multiset& x);
empty (1)
explicit multiset (const key_compare& comp = key_compare(),                   const allocator_type& alloc = allocator_type());explicit multiset (const allocator_type& alloc);
range (2)
template <class InputIterator>  multiset (InputIterator first, InputIterator last,            const key_compare& comp = key_compare(),            const allocator_type& = allocator_type());
copy (3)
multiset (const multiset& x);multiset (const multiset& x, const allocator_type& alloc);
move (4)
multiset (multiset&& x);multiset (multiset&& x, const allocator_type& alloc);
initializer list (5)
multiset (initializer_list<value_type> il,          const key_compare& comp = key_compare(),          const allocator_type& alloc = allocator_type());
empty (1)
mutiset();explicit multiset (const key_compare& comp,                   const allocator_type& alloc = allocator_type());explicit multiset (const allocator_type& alloc);
range (2)
template <class InputIterator>  multiset (InputIterator first, InputIterator last,            const key_compare& comp = key_compare(),            const allocator_type& = allocator_type());template <class InputIterator>  multiset (InputIterator first, InputIterator last,            const allocator_type& = allocator_type());
copy (3)
multiset (const multiset& x);multiset (const multiset& x, const allocator_type& alloc);
move (4)
multiset (multiset&& x);multiset (multiset&& x, const allocator_type& alloc);
initializer list (5)
multiset (initializer_list<value_type> il,          const key_compare& comp = key_compare(),          const allocator_type& alloc = allocator_type());multiset (initializer_list<value_type> il,          const allocator_type& alloc = allocator_type());
构造 multiset
构造一个 multiset 容器对象,根据使用的构造函数版本初始化其内容

(1) 空容器构造函数(默认构造函数)
构造一个 容器,不包含任何元素。
(2) 范围构造函数 ((2) range constructor)
构造一个容器,包含范围[first,last)中的元素数量,每个元素都从该范围中的相应元素构造。
(3) 复制构造函数
构造一个容器,包含 x 中所有元素的副本。

该容器会保留 alloccomp 的内部副本,这些副本在容器的整个生命周期中用于分配存储和对元素进行排序。
拷贝构造函数 (3) 创建一个容器,该容器保留并使用 x分配器比较对象 的副本。

元素的存储使用此 内部分配器 进行分配。

元素根据 比较对象 进行排序。
(1) 空容器构造函数(默认构造函数)
构造一个 容器,不包含任何元素。
(2) 范围构造函数 ((2) range constructor)
构造一个容器,包含范围[first,last)通过对范围中的每个元素使用 emplace-constructed 来构造。
(3) 拷贝构造函数(以及带分配器的拷贝)
构造一个容器,包含 x 中所有元素的副本。
(4) 移动构造函数(以及带分配器的移动)
构造一个容器,该容器获取 x 的元素。
如果指定了 alloc 且它与 x 的分配器不同,则元素将被移动。否则,不构造任何元素(它们的拥有权直接转移)。
x 将被置于一个不确定但有效的状态。
(5) 初始化列表构造函数
构造一个容器,包含 il 中所有元素的副本。

该容器会保留 alloc 的内部副本,用于分配和释放其元素的存储,以及根据其 allocator_traits 指定的方式构造和销毁它们。如果构造函数未传递 alloc 参数,则使用默认构造的分配器,但以下情况除外:
- 拷贝构造函数 (3, 第一个签名) 创建一个容器,该容器保留并使用通过调用 x 的分配器的相应 select_on_container_copy_construction 特性返回的分配器副本。
- 移动构造函数 (4, 第一个签名) 获取 x 的分配器。

该容器还保留 comp(或 x比较对象)的内部副本,该副本用于确定容器中元素的顺序并检查等价元素。

所有元素都通过调用具有适当参数的 allocator_traits::construct 来进行拷贝移动或以其他方式构造

元素根据 比较对象 进行排序。如果传递给构造函数的元素是等价的,则它们的相对顺序将得到保留。

参数

comp
二元谓词,它接受两个与 multiset 中包含的元素类型相同的参数,并返回true如果第一个参数在其定义的严格弱序中排在第二个参数之前,则返回false否则为 false。
这应该是一个函数指针或函数对象。
成员类型key_compare是容器使用的内部比较对象类型,在 multiset 中定义为其第二个模板参数的别名(Compare).
如果已知key_compare使用默认的 less(没有状态),此参数无关紧要。
alloc
分配器对象。
容器会保留并使用此分配器的内部副本。
成员类型allocator_type是容器使用的内部分配器类型,在 multiset 中定义为其第三个模板参数的别名(Alloc).
如果已知allocator_type是默认 allocator 的实例化(没有状态),此参数无关紧要。
first, last
指向范围内初始位置和最终位置的输入迭代器。 使用的范围是[first,last),它包括firstlast之间的所有元素,包括first指向的元素,但不包括last指向的元素。
函数模板参数InputIterator应为 输入迭代器 类型,指向可以从中构造value_type对象的类型的元素。
x
另一个 multiset 对象,类型相同(具有相同的类模板参数T, CompareAlloc),其内容被复制或获取。
il
il
这些对象是从初始化列表声明符自动构造的。
成员类型value_type是容器中元素的类型,在 multiset 中定义为第一个模板参数的别名(T).

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// constructing multisets
#include <iostream>
#include <set>

bool fncomp (int lhs, int rhs) {return lhs<rhs;}

struct classcomp {
  bool operator() (const int& lhs, const int& rhs) const
  {return lhs<rhs;}
};

int main ()
{
  std::multiset<int> first;                          // empty multiset of ints

  int myints[]= {10,20,30,20,20};
  std::multiset<int> second (myints,myints+5);       // pointers used as iterators

  std::multiset<int> third (second);                 // a copy of second

  std::multiset<int> fourth (second.begin(), second.end());  // iterator ctor.

  std::multiset<int,classcomp> fifth;                // class as Compare

  bool(*fn_pt)(int,int) = fncomp;
  std::multiset<int,bool(*)(int,int)> sixth (fn_pt); // function pointer as Compare

  return 0;
}

该代码不产生任何输出,但展示了构造 multiset 容器的几种方式。

复杂度

常量,用于空构造函数 (1)移动构造函数 (4)(除非 allocx 的分配器不同)。
对于所有其他情况,如果提供的序列是有序的且具有相同的排序标准,则复杂度与迭代器之间的距离成线性关系。对于无序序列,复杂度与该距离成对数线性关系(N*logN)(排序,拷贝构造)。

迭代器有效性

移动构造函数 (4) 会使与 x 相关的所有迭代器、指针和引用失效(如果元素被移动)。

数据竞争

所有复制的元素都会被访问。
移动构造函数 (4) 会修改 x

异常安全

强保证: 如果抛出异常,则没有任何效果。
如果对于元素构造不支持带有适当参数的 allocator_traits::construct,或者如果由[first,last)无效,则会导致未定义行为

另见