C++中的无序pair集合及示例

C++中的无序pair集合及示例

什么是pair?

C++中的utility库提供了pair容器。一个pair由两个数据元素或对象组成。

  • 第一个元素被称为“first”,第二个元素被称为“second”,并且它们的顺序是固定的(first, second)。
  • Pair用于将两个可能类型不同的值组合在一起。Pair提供了一种将两个异构对象存储为单个单元的方法。
  • 可以对pair进行分配、复制和比较。在一个map或hash_map中分配的对象数组默认为“pair”,其中所有的“first”元素都是唯一键,与它们的“second”的值对象相关联。
  • 要访问这些元素,我们使用变量名、点运算符和关键字first或second。

如何访问pair?

我们可以使用下面的代码片段中所解释的点(.)运算符来访问pair元素。

auto fistElement = myPair.first;
auto fistElement = myPair.second;

什么是无序集合?

无序集合是一种关联容器,与集合类似,但是在无序集合的情况下,元素不按任何特定顺序排列。无序集合可以像集合一样持有唯一的元素。无序集合内部使用哈希表实现,键被散列到哈希表的索引中。在无序集合中插入元素总是不可预测的或随机的。无序集合中的大部分操作时间复杂度为常数级别O(1),但在最坏情况下,时间复杂度可能上升到O(n)。

与无序集合相关的函数:

  • insert(x) : 在无序集合容器中插入一个新元素“x”。
  • begin() : 返回一个指向无序集合容器中第一个元素的迭代器。
  • end() : 返回一个指向虚拟的结束元素旁边的元素的迭代器。
  • count() : 计算无序集合容器中特定元素出现的次数。
  • erase() : 删除单个元素或从起始到结束(不包括)范围内的一系列元素。
  • size() : 返回无序集合容器中的元素数量。
  • swap() : 交换两个无序集合容器的值。
  • max_size() : 返回无序集合容器可以容纳的最大元素数量。
  • empty() : 检查无序集合容器是否为空。

在实现复杂的数据结构时,无序对的集合很有用。本文重点介绍如何在C++中创建无序对集合。

无序对集合

无序对集合是一个无序集合,其中每个元素本身都是一个pair。默认情况下,C++不允许我们直接创建无序对集合,但可以向无序集合容器传递一个哈希函数。

语法:

**unordered_set <pair<dataType1, dataType2>, hashFunction> myUnorderedSet; **

这里,

dataType1: 一个数据类型。

dataType2: 另一个数据类型。

hashFunction: 一个哈希函数。

//哈希函数   
结构体HashFunction   
{   
size_t operator()(const pair<int, int>&x) const{   
return x.first^x.second;   
} 

}; 

注意: dataType1和dataType2可以相似或不相似。

示例1: 下面是C++程序,演示一组无序的键值对的工作方式。

// C++ program to demonstrate 
// the working of unordered set 
// of pairs
#include <bits/stdc++.h>
using namespace std;
  
// Hash function 
struct hashFunction
{
  size_t operator()(const pair<int , 
                    int>&x) const
  {
    return x.first ^ x.second;
  }
};
  
// Function to print unordered set elements
void print(unordered_set<pair<int, int>, 
           hashFunction>& myUnorderedSet)
{ 
  // Iterating over unordered set elements
  for (auto currentPair : myUnorderedSet)
  {
    // Each element is a pair itself
    pair<int, int> pr = currentPair;
  
    cout << "[ ";
  
    // Printing pair elements
    cout << pr.first << "  " << 
            pr.second;
    cout << " ]";
    cout << "\n";
  }
}
  
// Driver code
int main()
{
  // Declaring an unordered set of pairs
  unordered_set<pair<int, int>, 
  hashFunction> myUnorderedSet;
  
  // Initializing pairs of int type
  pair<int, int> pair1;
  pair1 = make_pair(4, 2);
  
  pair<int, int> pair2;
  pair2 = make_pair(2, 3);
  
  pair<int, int> pair3;
  pair3 = make_pair(2, 3);
  
  pair<int, int> pair4;
  pair4 = make_pair(5, 8);
  
  pair<int, int> pair5;
  pair5 = make_pair(9, 5);
  
  
  // Inserting pairs in the unordered set
  myUnorderedSet.insert(pair1);
  myUnorderedSet.insert(pair2);
  myUnorderedSet.insert(pair3);
  myUnorderedSet.insert(pair4);
  myUnorderedSet.insert(pair5);
  
  // Calling print function
  print(myUnorderedSet);
  return 0;
 }  

输出:

[ 9 5 ]   
[ 5 8 ]   
[ 4 2 ]   
[ 2 3 ] 

示例2: 下面是C++程序,演示一组无序的键值对的工作方式。

// C++程序演示无序pair集合的工作
#include <bits/stdc++.h>
using namespace std;
  
// 哈希函数
struct hashFunction
{
  size_t operator()(const pair<bool, 
                    bool> &x) const
  {
    return x.first ^ x.second;
  }
};
  
// 打印无序集合元素的函数
void print(unordered_set<pair<bool, bool>,
           hashFunction> &myUnorderedSet)
{ 
  // 遍历无序集合元素
  for (auto currentPair : myUnorderedSet)
  {
    // 每个元素本身就是一个pair
    pair<bool, bool> pr = currentPair;
  
    cout << "[ ";
  
    // 打印pair元素
    cout << pr.first << "  " << 
            pr.second;
    cout << " ]";
    cout << "\n";
  }
}
  
// 主函数
int main()
{
  // 通过将哈希函数作为第二个参数传递给无序集合,声明一个pair无序集合
  unordered_set<pair<bool, bool>, 
  hashFunction> myUnorderedSet;
  
  // 初始化布尔类型的pairs
  pair<bool, bool> pair1;
  pair1 = make_pair(0, 0);
  
  pair<bool, bool> pair2;
  pair2 = make_pair(0, 1);
  
  pair<bool, bool> pair3;
  pair3 = make_pair(1, 0);
  
  pair<bool, bool> pair4;
  pair4 = make_pair(1, 1);
  
  pair<bool, bool> pair5;
  pair5 = make_pair(0, 0);
  
  
  // 将pairs插入无序集合
  myUnorderedSet.insert(pair1);
  myUnorderedSet.insert(pair2);
  myUnorderedSet.insert(pair3);
  myUnorderedSet.insert(pair4);
  myUnorderedSet.insert(pair5);
  
  // 调用print函数
  print(myUnorderedSet);
  return 0;
}  

输出:

[ 1 1 ]   
[ 0 0 ]   
[ 1 0 ]   
[ 0 1 ] 

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

C++ 教程