在C++中set,multiset,unordered_set,和unordered_multiset的区别

在C++中set,multiset,unordered_set,和unordered_multiset的区别

在C++标准模板库中,set,multiset,unordered_set,和unordered_multiset被用来存储元素。虽然它们相似,但在某些功能上不同。下面讨论了它们的差异。

1. Set: Set是关联容器,按特定顺序存储唯一元素。 以下是set的属性:

  • 按排序顺序存储值。
  • 仅存储唯一值。
  • 只能插入或删除元素,不能修改元素。
  • 我们可以通过给定开始迭代器和结束迭代器位置来删除多个元素。
  • 使用迭代器遍历。
  • Set使用二叉搜索树实现。

语法:

set<datatype> setname;
C++

以下示例演示set的应用。

// CPP program to demonstrate insert and
// delete in set
#include <bits/stdc++.h>
using namespace std;
 
// Driver code
int main()
{
    // set declare
    set<int> s;
 
    // Elements added to set
    s.insert(12);
    s.insert(10);
    s.insert(2);
    // duplicate added
    s.insert(10);
    s.insert(90);
    s.insert(85);
    s.insert(45);
 
    // Iterator declared to traverse
    // set elements
    set<int>::iterator it, it1, it2;
    cout << "Set elements after sort and "
            "removing duplicates:\n";
    for (it = s.begin(); it != s.end(); it++)
        cout << *it << ' ';
    cout << '\n';
 
    it1 = s.find(10);
    it2 = s.find(90);
 
    // elements from 10 to elements before
    // 90 erased
    s.erase(it1, it2);
    cout << "Set Elements after erase:\n";
    for (it = s.begin(); it != s.end(); it++)
        cout << *it << ' ';
 
    return 0;
}  
C++

输出

Set elements after sort and removing duplicates:
2 10 12 45 85 90 
Set Elements after erase:
2 90 
C++

2. Multisets: Multisets是关联容器,存储具有等价值的多个元素,按特定顺序排序。以下是multisets的属性:

  • 按排序顺序存储元素。
  • 它允许存储多个元素。
  • 我们可以通过给定开始迭代器和结束迭代器来删除多个元素。

注意: 其他所有属性与set相似。

语法:

multiset<datatype> multisetName;
C++

以下示例演示了multiset的应用。

// CPP program to demonstrate insert and
// delete in set
#include <bits/stdc++.h>
using namespace std;
 
// Driver Code
int main()
{
    // multiset declare
    multiset<int> s;
 
    // Elements added to set
    s.insert(12);
    s.insert(10);
    s.insert(2);
    // duplicate added
    s.insert(10);
    s.insert(90);
    s.insert(85);
    s.insert(45);
 
    // Iterator declared to traverse
    // set elements
    multiset<int>::iterator it, it1, it2;
    cout << "Multiset elements after sort\n";
    for (it = s.begin(); it != s.end(); it++)
        cout << *it << ' ';
    cout << '\n';
 
    it1 = s.find(10);
    it2 = s.find(90);
 
    // elements from 10 to elements before 90
    // erased
    s.erase(it1, it2);
 
    cout << "Multiset Elements after erase:\n";
    for (it = s.begin(); it != s.end(); it++)
        cout << *it << ' ';
 
    return 0;
}  
C++

输出

排序后的多重集合元素
2 10 10 12 45 85 90 
删除后的多重集合元素:
2 90 
C++

3. 无序集合: 无序集合是一种关联容器,可以以任意顺序存储唯一的元素。以下是无序集合的特点: ****

  • 元素可以按任意顺序存储(没有排序顺序)。
  • 仅存储唯一值。
  • 使用哈希表存储元素。
  • 我们只能删除给定迭代器位置的元素。

注意: 所有其他属性与集合相似。

语法:

unordered_set<datatype> setname;
C++

以下示例演示了无序集合的应用。

// CPP程序演示在unordered_set中插入和
//删除
#include <bits/stdc++.h>
using namespace std;
int main()
{
    // 声明unordered_set
    unordered_set<int> s;

    // 向集合中添加元素
    s.insert(12);
    s.insert(10);
    s.insert(2);
    // 添加重复的
    s.insert(10);
    s.insert(90);
    s.insert(85);
    s.insert(45);
    s.insert(12);
    s.insert(70);

    // 声明迭代器遍历集合元素
    unordered_set<int>::iterator it, it1;
    cout << "无序集合排序后的元素:\n";
    for (it = s.begin(); it != s.end(); it++)
        cout << *it << ' ';
    cout << '\n';

    it1 = s.find(10);

    //删除元素10
    s.erase(it1);
    cout << "删除后的无序集合元素:\n";
    for (it = s.begin(); it != s.end(); it++)
        cout << *it << ' ';

    return 0;
}  
C++

输出

无序集合排序后的元素:
10 45 12 70 2 90 85 
删除后的无序集合元素:
45 12 70 2 90 85 
C++

4. 无序多重集合: 无序多重集合是一个包含一组非唯一元素的关联容器,其元素没有排序顺序。以下是无序多重集合的特点:

  • 元素可以按任意顺序存储。
  • 可以存储重复的元素。
  • 使用哈希表存储元素。
  • 我们只能删除给定迭代器位置的元素。

注意: 所有其他属性与集合相似。

语法:

unordered_multiset<datatype> multisetName;
C++

以下示例演示了无序多重集合的应用。

// CPP程序演示insert和
//从unordered_multiset中删除
#include <bits/stdc++.h>
using namespace std;
int main()
{
    // unordered_multiset声明
    unordered_multiset<int> s;

    // 向集合中添加元素
    s.insert(12);
    s.insert(10);
    s.insert(2);
    // 添加重复元素
    s.insert(10);
    s.insert(90);
    s.insert(85);
    s.insert(45);

    // 声明迭代器遍历集合元素
    unordered_multiset<int>::iterator it, it1;
    cout << "无序多重集合排序后的元素:\n";
    for (it = s.begin(); it != s.end(); it++)
        cout << *it << ' ';
    cout << '\n';

    it1 = s.find(10);

    //删除元素10
    s.erase(it1);

    cout << "删除后的无序多重集合元素:\n";
    for (it = s.begin(); it != s.end(); it++)
        cout << *it << ' ';

    return 0;
}  
C++

输出

无序多重集合排序后的元素:
10 10 45 12 90 85 2 
删除后的无序多重集合元素:
45 12 90 85 2 
C++
排序后的无序多重集合元素:
45 10 10 12 2 90 85 
擦除后的无序多重集合元素:
45 10 12 2 90 85 
C++

set、multiset、unordered_set和unordered_multiset之间的区别:

  • 简而言之, set 是一种存储 排序并且唯一 元素的容器。如果添加了 unordered ,则表示元素 无序
  • 如果添加了 multiset ,则表示可以 存储重复元素

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册