multiset(); // (1) C++14
explicit multiset(const Compare& comp,
const Allocator& = Allocator()); // (2) C++14
explicit multiset(const Compare& comp = Compare(),
const Allocator& alloc = Allocator()); // (1) + (2) C++03
explicit multiset(const Allocator& alloc); // (3) C++11
template <class InputIterator>
multiset(InputIterator first, InputIterator last,
const Compare& comp = Compare(),
const Allocator& alloc = Allocator()); // (4) C++03
template <class InputIterato>
multiset(InputIterator first, InputIterator last,
const Allocator& a); // (5) C++14
multiset(const set& x); // (6) C++03
multiset(set&& y); // (7) C++11
multiset(const set& x, const Allocator& alloc); // (8) C++11
multiset(set&& y, const Allocator& alloc); // (9) C++11
multiset(initializer_list<value_type> init,
const Compare& comp = Compare(),
const Allocator& alloc = Allocator()); // (10) C++11
multiset(initializer_list<value_type> init,
const Allocator& a); // (11) C++14
template <container-compatible-range <value_type> R>
multiset(from_range_t, R&& rg,
const Compare& comp = Compare(),
const Allocator& alloc = Allocator()); // (12) C++23
template <container-compatible-range <value_type> R>
multiset(from_range_t, R&& rg,
const Allocator& alloc); // (13) C++23
概要
multisetオブジェクトを、以下に示す通りの要素で初期化する。
効果
- (1) : デフォルトコンストラクタ。要素数が空の
multisetオブジェクトを構築する。 - (2) : 比較関数オブジェクトを受け取るコンストラクタ。受け取った比較関数オブジェクトを、このコンテナでの要素比較に使用する。要素数が空の
multisetオブジェクトを構築する。 - (1) + (2) : デフォルトコンストラクタ。空のコンテナを構築する。
- (3) : アロケータを別で受け取り、要素数が空の
multisetオブジェクトを構築する。 - (4) : 範囲
[first, last)のコンテンツで構築する。 - (5) : (4)のコンストラクタを
multiset(first, last, Compare(), a)のように呼び出して、multisetオブジェクトを構築する。 - (6), (8) : コピーコンストラクタ。
xのコンテンツのコピーでコンテナを構築する。もしallocが与えられなかった場合、アロケータをstd::allocator_traits<allocator_type>::select_on_container_copy_construction(x.get_allocator())の呼び出しによって取得する。 - (7), (9) : ムーブコンストラクタ。
yのコンテンツをムーブすることでコンテナを構築する。もしallocが与えられなかった場合、アロケータをyに属しているアロケータをムーブして取得する。 - (10) : 初期化リスト
initのコンテンツでコンテナを構築する。 - (11) : (10)のコンストラクタを
multiset(init, Compare(), a)のように呼び出して、multisetオブジェクトを構築する。 - (12) : Range
rgの要素でmultisetオブジェクトを構築する。 - (13) : (12)のコンストラクタを
multiset(from_range, rg, Compare(), alloc)のように呼び出して、multisetオブジェクトを構築する。
計算量
- (1), (2), (3) : 定数時間。
- (4), (5) :
compによって既にソート済みである場合は、イテレータ間の距離(コピーコンストラクト)。未ソートのシーケンスの場合は、それらの距離について N * logN (ソート、コピーコンストラクト)。 - (6), (8) :
xのsizeに対して線形時間(全要素をコピー構築する)。 - (7), (9) : 定数時間。ただし、
allocが与えられてかつalloc != y.get_allocator()の場合は線形時間。 - (10), (11) :
compによって既にソート済みである場合は、initのサイズ(コピーコンストラクト)。未ソートのinitの場合は、initのサイズについて N * logN (ソート、コピーコンストラクト)。 - (12), (13) :
compによって既にソート済みである場合は、rgのサイズ(コピーコンストラクト)。未ソートのrgの場合は、rgのサイズについて N * logN (ソート、コピーコンストラクト)。
備考
-
C++14 では、デフォルトコンストラクタを (1) + (2) の形式から (1) の形式に分離して残りを (2) の形式(
compのデフォルト引数を削除)にした。 これは、デフォルトコンストラクタにexplicitが付いていると、std::multiset<int> s = {};のようなコード(C++11 から導入された、コピーリスト初期化によるデフォルトコンストラクタ呼び出し)がエラーになってしまうためである。
-
C++14 では、(5) に形式が新たに追加された。 これは、イテレータ範囲
[first, last)のみを引数にとるアロケータ使用構築(uses-allocator construction)に失敗してしまうためである。 具体的には、C++11 では以下のようなコードがエラーになってしまう。#include <list> #include <set> #include <scoped_allocator> #include <iterator> #include <memory> int main() { using sii = std::multiset<int>; std::list<sii, std::scoped_allocator_adaptor<std::allocator<sii>>> ls; int a[] = {1, 2, 3}; ls.emplace_back(std::begin(a), std::end(a)); }なお、C++14 では同様の理由で (11) の形式も新たに追加されているが、こちらは存在しなくてもエラーとはならない。
(multiset(init, alloc)の形式の構築では、(11) の形式が無い場合でも (10) の形式を用いてinitから一時multisetが構築され、allocと共に (9) の形式に引き渡される)
例
出力
Size of c1: 7
Size of c2: 7
関連項目
| 名前 | 説明 |
|---|---|
operator= |
代入演算子 |
insert |
要素を挿入する |
参照
- N2679 Initializer Lists for Standard Containers(Revision 1)
- (10)の経緯となる提案文書
- LWG 2193. Default constructors for standard library containers are explicit
explicit set(const Compare& comp = Compare(), const Allocator& alloc = Allocator());を 2 つのオーバーロードに分割するきっかけとなったレポート - LWG 2210. Missing allocator-extended constructor for allocator-aware containers
(5), (11) を追加するきっかけとなったレポート
なお、Discussion の例はアロケータの型が誤っているので注意