📜  C++ STL-Multiset构造函数

📅  最后修改于: 2020-10-19 01:15:23             🧑  作者: Mango

C++ Multiset构造函数

Multiset构造函数有以下五种用途:

  • 默认(空)构造函数:用于构造具有零个元素的空Multiset容器。
  • 范围构造器:用于构造内容范围为[first,last)的容器。
  • 复制构造函数:用于构造具有现有容器元素副本的multiset。
  • move构造函数:用于使用move语义与其他元素一起构造容器。
  • 初始化列表构造函数:用于构造带有初始化列表内容的multiset。

句法

默认构造函数

explicit multiset (const key_compare& comp = key_compare(),
              const allocator_type& alloc = allocator_type());                //until C++ 11

explicit multiset (const key_compare& comp = key_compare(),
              const allocator_type& alloc = allocator_type());
explicit multiset (const allocator_type& alloc);            //until C++ 14    

mutiset();
explicit multiset (const key_compare& comp,
                   const allocator_type& alloc = allocator_type());        //since C++ 14
explicit multiset (const allocator_type& alloc);

范围构造器

template 
  multiset (InputIterator first, InputIterator last,
       const key_compare& comp = key_compare(),
       const allocator_type& alloc = allocator_type());        //until C++ 11

template 
  multiset (InputIterator first, InputIterator last,
       const key_compare& comp = key_compare(),
       const allocator_type& = allocator_type());            //until C++ 14    

template 
  multiset (InputIterator first, InputIterator last,
            const key_compare& comp = key_compare(),
            const allocator_type& = allocator_type());
template 
  multiset (InputIterator first, InputIterator last,
            const allocator_type& = allocator_type());        //since C++ 14

复制构造函数

multiset (const multiset& x);                        //until C++ 11
    
multiset (const multiset& x);
multiset (const multiset& x, const allocator_type& alloc);            //since C++ 11

移动构造函数

multiset (multiset&& x);
multiset (multiset&& x, const allocator_type& alloc);            //since C++ 11

初始化列表构造函数

multiset (initializer_list il,
     const key_compare& comp = key_compare(),
     const allocator_type& alloc = allocator_type());        //until C++ 14

multiset (initializer_list il,
          const key_compare& comp = key_compare(),        
          const allocator_type& alloc = allocator_type());
multiset (initializer_list il,
          const allocator_type& alloc = allocator_type());        //since C++ 14

参数

comp:一个比较函数对象,它带有两个关键参数,如果第一个参数位于第二个参数之前,则返回true;否则,返回false。默认情况下,它使用较少谓词。

alloc:一个分配器对象,用于此容器的所有内存分配。

first:将迭代器输入到范围中的第一个位置。

last:将迭代器输入到范围中的最后一个位置。

x:另一个相同类型的多集对象。

il:一个初始化器列表对象,将从中复制元素。

返回值

构造函数从不返回任何值。

复杂度

对于空的构造函数和move构造函数,复杂度将是恒定的。

对于所有其他情况,如果元素已经排序,则迭代器之间的距离的复杂度将是线性的。

迭代器有效性

如果将多集容器的元素在move构造函数中移动,则使与x相关的所有指针,迭代器和引用无效。

数据竞争

访问所有复制的元素。

异常安全

万一引发异常,则没有任何影响。

例子1

让我们看一下默认构造函数的简单示例:

#include 
#include 

using namespace std;

int main(void) {
   // Default constructor
   multiset s;
  
   int size = s.size(); 

   cout << "Size of multiset s = " << size;
   return 0;
}

输出:

Size of multiset = 0

在上面的示例中,s是一个空的多集,因此size为0。

例子2

我们来看一个范围构造器的简单示例:

#include 
#include 

using namespace std;

int main(void) {
   int evens[] = {2,6,6,8,10};
  
   // Range Constructor
   multiset mymultiset (evens, evens+5);  

   cout << "Size of multiset container mymultiset is : " << mymultiset.size();
   return 0;
}

输出:

Size of multiset container mymultiset is: 5

在上面的示例中,多集mymultiset由偶数元素构成。

例子3

让我们看一下复制构造函数的简单示例:

#include 
#include 

using namespace std;

int main(void) {
   //Default Constructor
   multiset s1;
   s1.insert(5);
   s1.insert(5);

   cout << "Size of multiset container s1 is : " << s1.size();
  
   // Copy constructor
   multiset s2(s1);
   cout << "\nSize of new multiset container s2 is : " << s2.size();
   return 0;
}

输出:

Size of multiset container s1 is: 2
Size of new multiset container s2 is: 2

在上面的示例中,s2是s1多集的副本。

例子4

我们来看一个简单的移动构造器示例:

#include 
#include 

using namespace std;

int main(void) {
   // Default constructor
   multiset s1;
   s1.insert('x');
   s1.insert('y');
   s1.insert('y');

   cout << "Size of multiset container s1 is : " << s1.size();

   // Move constructor
   multiset s2(move(s1));
   cout << "\nSize of new multiset container s2 is : " << s2.size();
   return 0;
}

输出:

Size of multiset container s1 is: 3
Size of new multiset container s2 is: 3

在上面的示例中,s1的内容被移至s2 multiset。

例子5

让我们看一个简单的初始化列表构造函数示例:

#include 
#include 
#include 

using namespace std;

int main() {
   // Initializer list constructor
   multiset fruit {"orange", "apple", "mango", "apple", "grape"};

   cout << "Size of multiset container fruit is: " << fruit.size();
   return 0;
}

输出:

Size of multiset container fruit is: 5

上面的示例创建一个以字符串为键的多集水果,并使用initializer_list对其进行初始化。