📜  C ++中set,multiset,unordered_set,unordered_multiset之间的区别

📅  最后修改于: 2022-05-13 01:54:55.953000             🧑  作者: Mango

C ++中set,multiset,unordered_set,unordered_multiset之间的区别

在 C++ 标准模板库中,set、multiset、unordered_set、unordered_multiset 用于存储元素。尽管它们相似,但在某些功能上彼此不同。下面讨论这些差异:

1.集合它们是关联容器,按照特定顺序存储唯一元素。 以下是集合的属性:

  • 按排序顺序存储值。
  • 仅存储唯一值。
  • 元素只能插入或删除,但不能修改。
  • 我们可以通过给出开始迭代器和结束迭代器的位置来擦除超过 1 个元素。
  • 使用迭代器进行遍历。
  • 集合被实现为二叉搜索树。

句法:

set setname;

下面的例子演示了set的应用。

CPP
// CPP program to demonstrate insert and
// delete in set
#include 
using namespace std;
 
// Driver code
int main()
{
    // set declare
    set 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::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;
}


CPP
// CPP program to demonstrate insert and
// delete in set
#include 
using namespace std;
 
// Driver Code
int main()
{
    // multiset declare
    multiset 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::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;
}


CPP
// CPP program to demonstrate insert and
// delete in unordered_set
#include 
using namespace std;
int main()
{
    // unordered_set declare
    unordered_set 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);
    s.insert(12);
    s.insert(70);
 
    // Iterator declared to traverse
    // set elements
    unordered_set::iterator it, it1;
    cout << "Unordered_set elements after sort:\n";
    for (it = s.begin(); it != s.end(); it++)
        cout << *it << ' ';
    cout << '\n';
 
    it1 = s.find(10);
 
    // element 10 erased
    s.erase(it1);
    cout << "Unordered_set Elements after erase:\n";
    for (it = s.begin(); it != s.end(); it++)
        cout << *it << ' ';
 
    return 0;
}


CPP
// CPP program to demonstrate insert and
// delete in unordered_multiset
#include 
using namespace std;
int main()
{
    // unordered_multiset declare
    unordered_multiset 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
    unordered_multiset::iterator it, it1;
    cout << "Unordered-Multiset elements after sort:\n";
    for (it = s.begin(); it != s.end(); it++)
        cout << *it << ' ';
    cout << '\n';
 
    it1 = s.find(10);
 
    // element 10 trained
    s.erase(it1);
 
    cout << "Unordered-Multiset Elements after "
            "erase:\n";
    for (it = s.begin(); it != s.end(); it++)
        cout << *it << ' ';
 
    return 0;
}


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

2. Multiset 它们是关联容器,按照特定顺序存储具有等效值的多个元素。以下是多集的属性:

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

注意:所有其他属性都与该集合类似。

句法:

multiset multisetName;

下面的例子演示了 Multiset 的应用。

CPP

// CPP program to demonstrate insert and
// delete in set
#include 
using namespace std;
 
// Driver Code
int main()
{
    // multiset declare
    multiset 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::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;
}
输出
Multiset elements after sort
2 10 10 12 45 85 90 
Multiset Elements after erase:
2 90 

3.无序集:  它们是关联容器,以无特定顺序存储唯一元素。以下是 Unordered_sets 的属性:  

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

注意:所有其他属性都与该集合类似。

句法:

unordered_set setname;

下面的例子演示了无序集的应用。

CPP

// CPP program to demonstrate insert and
// delete in unordered_set
#include 
using namespace std;
int main()
{
    // unordered_set declare
    unordered_set 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);
    s.insert(12);
    s.insert(70);
 
    // Iterator declared to traverse
    // set elements
    unordered_set::iterator it, it1;
    cout << "Unordered_set elements after sort:\n";
    for (it = s.begin(); it != s.end(); it++)
        cout << *it << ' ';
    cout << '\n';
 
    it1 = s.find(10);
 
    // element 10 erased
    s.erase(it1);
    cout << "Unordered_set Elements after erase:\n";
    for (it = s.begin(); it != s.end(); it++)
        cout << *it << ' ';
 
    return 0;
}
输出
Unordered_set elements after sort:
10 45 12 70 2 90 85 
Unordered_set Elements after erase:
45 12 70 2 90 85 

4. Unordered_multiset 它是一个关联容器,其中包含一组未排序的非唯一元素。以下是 Unordered_multiset 的属性:

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

注意:所有其他属性都与该集合类似。

句法:

unordered_multiset multisetName;

下面的例子演示了 Unordered multiset 的应用。

CPP

// CPP program to demonstrate insert and
// delete in unordered_multiset
#include 
using namespace std;
int main()
{
    // unordered_multiset declare
    unordered_multiset 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
    unordered_multiset::iterator it, it1;
    cout << "Unordered-Multiset elements after sort:\n";
    for (it = s.begin(); it != s.end(); it++)
        cout << *it << ' ';
    cout << '\n';
 
    it1 = s.find(10);
 
    // element 10 trained
    s.erase(it1);
 
    cout << "Unordered-Multiset Elements after "
            "erase:\n";
    for (it = s.begin(); it != s.end(); it++)
        cout << *it << ' ';
 
    return 0;
}
输出
Unordered-Multiset elements after sort:
45 10 10 12 2 90 85 
Unordered-Multiset Elements after erase:
45 10 12 2 90 85 

set、multiset、unordered_set、unordered_multiset的区别:

  • 简单来说, set是一个容器,用于存储已排序且唯一的元素。如果添加unordered则表示元素未排序
  • 如果添加了multiset意味着允许重复元素存储。