C++标准模板库(STL)中的Multiset

C++标准模板库(STL)中的Multiset

Multiset是一种类似于set的关联容器类型,唯一的区别是允许有多个元素具有相同的值。 一些与multiset相关的基本函数:

  • begin() – 返回multiset中第一个元素的迭代器 -> O(1)
  • end() – 返回multiset中最后一个元素的迭代器之后的理论元素 -> O(1)
  • size() – 返回multiset中的元素个数 -> O(1)
  • max_size() – 返回multiset可以容纳的最大元素数 -> O(1)
  • empty() – 返回multiset是否为空 -> O(1)
  • insert(x) – 在multiset中插入元素x -> O(log n)
  • clear() – 从multiset中删除所有元素 -> O(n)
  • erase(x) – 移除所有等于x的元素 -> O(log n)

实现:

// CPP程序演示multiset的实现 
      #include <iostream> 
      #include <iterator> 
      #include <set> 
       
      using namespace std; 
       
      int main() 
      { 
          // 空的multiset容器 
          multiset<int, greater<int> > gquiz1; 
       
          // 以随机顺序插入元素 
          gquiz1.insert(40); 
          gquiz1.insert(30); 
          gquiz1.insert(60); 
          gquiz1.insert(20); 
          gquiz1.insert(50); 
       
          // 与set不同,50将再次被添加到multiset中 
          gquiz1.insert(50); 
          gquiz1.insert(10); 
       
          // 打印multiset gquiz1 
          multiset<int, greater<int> >::iterator itr; 
          cout << "\nThe multiset gquiz1 is : \n"; 
          for (itr = gquiz1.begin(); itr != gquiz1.end(); ++itr) { 
              cout << *itr << " "; 
          } 
          cout << endl; 
       
          // 从gquiz1分配元素给gquiz2 
          multiset<int> gquiz2(gquiz1.begin(), gquiz1.end()); 
       
          // 打印multiset gquiz2的所有元素 
          cout << "\nThe multiset gquiz2 \n" 
                  "after assign from gquiz1 is : \n"; 
          for (itr = gquiz2.begin(); itr != gquiz2.end(); ++itr) { 
              cout << *itr << " "; 
          } 
          cout << endl; 
       
          // 从gquiz2中删除所有小于值为30的元素 
          cout << "\ngquiz2 after removal \n" 
                  "of elements less than 30 : \n"; 
          gquiz2.erase(gquiz2.begin(), gquiz2.find(30)); 
          for (itr = gquiz2.begin(); itr != gquiz2.end(); ++itr) { 
        cout << *itr << " "; 
          } 
       
          // 在gquiz2中删除所有值为50的元素 
          int num; 
          num = gquiz2.erase(50); 
          cout << "\ngquiz2.erase(50) : \n"; 
          cout << num << " removed \n"; 
          for (itr = gquiz2.begin(); itr != gquiz2.end(); ++itr) { 
              cout << *itr << " "; 
          } 
       
          cout << endl; 
       
          // multiset gquiz1的下限和上限 
          cout << "\ngquiz1.lower_bound(40) : \n" 
               << *gquiz1.lower_bound(40) << endl; 
          cout << "gquiz1.upper_bound(40) : \n" 
               << *gquiz1.upper_bound(40) << endl; 
       
          // multiset gquiz2的下限和上限 
          cout << "gquiz2.lower_bound(40) : \n" 
               << *gquiz2.lower_bound(40) << endl; 
          cout << "gquiz2.upper_bound(40) : \n" 
               << *gquiz2.upper_bound(40) << endl; 
       
          return 0; 
      } 

输出

The multiset gquiz1 is : 
60 50 50 40 30 20 10 

The multiset gquiz2 
after assign from gquiz1 is : 
10 20 30 40 50 50 60 

gquiz2 after removal 
of elements less than 30 : 
30 40 50 50 60 
gquiz2.erase(50) : 
2 removed 
30 40 60 

gquiz1.lower_bound(40) : 
40
gquiz1.upper_bound(40) : 
30
gquiz2.lower_bound(40) : 
40
gquiz2.upper_bound(40) : 
60 

从多重集中移除具有相同值的元素:

  • a.erase() – 移除多重集中所有具有相同值的元素
  • a.erase(a.find()) – 仅移除多重集中一个具有相同值的元素

在多重集上执行各种操作的时间复杂度为 –

  • 元素插入 – O(logN)
  • 元素访问 – O(logN)
  • 元素删除 – O(logN)
// 用于从具有相同值的多重集中移除元素的CPP代码
# include <bits/stdc++.h>
using namespace std;
 
int main()
{
    multiset<int> a;
    a.insert(10);
    a.insert(10);
    a.insert(10);
 
    // it will give output 3
    cout << a.count(10) << endl;
 
    // 从多重集中移除一个实例
 
    // 它将仅从多重集中移除一个值为10的值
    a.erase(a.find(10));
 
    // it will give output 2
    cout << a.count(10) << endl;
 
    // 从多重集中移除所有元素实例
    // 它将移除所有值为10的元素实例
    a.erase(10);
 
    // 它将输出0,因为所有值的实例
    // 已从多重集中移除
    cout << a.count(10) << endl;
 
    return 0;
}  

输出

3
2
0

时间复杂度: O(max(Σ(log(i)),(K+log(n))),其中i是插入时多重集的大小,K是传递的值的总计数,n是多重集的大小。

辅助空间: O(1)。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

C++ 教程