📜  带有示例的 C++ 中的无序元组集

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

带有示例的 C++ 中的无序元组集

什么是元组?

C++ 中的元组是用于将元素组合在一起的对象。在元组中,元素可以是相同的数据类型或不同的数据类型。元组的元素按照它们被访问的顺序进行初始化。

与元组关联的函数:

1、make_tuple(): make_tuple()用于给元组赋值。传递的值应该与元组中声明的值顺序一致。
2. get(): get() 用于访问元组值并对其进行修改,它接受索引和元组名称作为参数来访问特定的元组元素。

什么是无序集?

无序集是类似于集合的无序关联容器,但在无序集的情况下,元素不以任何特定顺序排列。像集合一样,无序集合也包含独特的元素。无序集在内部使用散列表实现,键被散列到散列表的索引中。无序集中的插入总是不可预测或随机的。无序集中的大多数操作都需要固定时间 O(1),但在最坏的情况下,时间复杂度可能会上升到 O(n)。

与无序集相关的函数:

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

每当算法需要复杂的数据结构时,一组无序的元组就非常有用。

本文重点介绍如何在 C++ 中创建一组无序的元组。请注意,为简单起见,我们考虑了一个包含三个元素的元组,但一个元组也可以包含更多或更少的元素。

无序的元组集

元组的无序集是其中每个元素都是一个元组的无序集。请注意,默认情况下,无序集没有元组的功能。简单来说,不能直接在 C++ 中声明一组无序的元组。必须将哈希函数作为参数传递给无序集。

句法:

示例 1:下面是使用一组无序元组的实现。

C++
// C++ program to illustrate the
// implementation of unorderedSet of
// tuples
#include 
using namespace std;
  
// Hash function
struct hashFunction
{
  size_t operator()(const tuple&x) const
  {
    return get<0>(x) ^ get<1>(x) ^ get<2>(x);
  }
};
  
// Function to print unordered set elements
void print(unordered_set, hashFunction > &unorderedSetOfTuples)
{ 
  // Iterating over unorderedSetOfTuples elements
  for (auto currentTuple : unorderedSetOfTuples)
  {
    // Each element is a tuple itself
    tuple tp = currentTuple;
  
    cout << "[ ";
  
    // Printing tuple elements
    cout << get<0>(tp) <<
      " , " << get<1>(tp) <<
      " , " << get<2>(tp) ;
    cout << " ]";
  
    cout << "\n";
  }
  
}
  
// Driver code
int main()
{
  // Declaring a unordered set of tuples
  unordered_set, hashFunction > unorderedSetOfTuples;
  
  // Initializing tuples of int type
  tuple tuple1;
  tuple1 = make_tuple(4, 2, 3);
  
  tuple tuple2;
  tuple2 = make_tuple(2, 3, 5);
  
  tuple tuple3;
  tuple3 = make_tuple(2, 3, 5);
  
  tuple tuple4;
  tuple4 = make_tuple(2, 1, 4);
  
  tuple tuple5;
  tuple5 = make_tuple(4, 2, 3);
  
  
  // Inserting into unordered set
  unorderedSetOfTuples.insert(tuple1);
  unorderedSetOfTuples.insert(tuple2);
  unorderedSetOfTuples.insert(tuple3);
  unorderedSetOfTuples.insert(tuple4);
  unorderedSetOfTuples.insert(tuple5);
  
  // Calling print function
  print(unorderedSetOfTuples);
  return 0;
}


C++
// C++ program to illustrate the
// implementation of unordered set of
// tuples
#include 
using namespace std;
   
// Hash function
struct hashFunction
{
  size_t operator()(const tuple&x) const
  {
    return get<0>(x) ^ std::get<1>(x) ^ std::get<2>(x);
  }
};
  
// Function to print unorderedSet elements
void print(unordered_set, hashFunction > &unorderedSetOfTuples)
{
  // Iterating over unorderedSetOfTuples elements
  for (auto currentTuple : unorderedSetOfTuples)
  {
    // Each element is a tuple itself of 
    // bool type
    tuple tp = currentTuple;
  
    cout << "[ ";
  
    // Printing tuple elements
    cout << get<0>(tp) <<
            " , " << get<1>(tp) <<
            " , " << get<2>(tp) ;
    cout << " ]";
  
    cout << "\n";
  }
  
}
  
// Driver code
int main()
{
  // Declaring a unordered set of tuples
  unordered_set, hashFunction > unorderedSetOfTuples;
  
  // Initializing tuples of bool type
  tuple tuple1;
  tuple1 = make_tuple(0, 1, 1);
  
  tuple tuple2;
  tuple2 = make_tuple(1, 1, 1);
  
  tuple tuple3;
  tuple3 = make_tuple(0, 1, 1);
  
  tuple tuple4;
  tuple4 = make_tuple(0, 0, 0);
  
  tuple tuple5;
  tuple5 = make_tuple(1, 1, 0);
  
  tuple tuple6;
  tuple6 = make_tuple(0, 1, 1);
  
  // Inserting into the unordered set
  unorderedSetOfTuples.insert(tuple1);
  unorderedSetOfTuples.insert(tuple2);
  unorderedSetOfTuples.insert(tuple3);
  unorderedSetOfTuples.insert(tuple4);
  unorderedSetOfTuples.insert(tuple5);
  unorderedSetOfTuples.insert(tuple6);
  
  // Calling print function
  print(unorderedSetOfTuples);
  return 0;
}


输出:

解释:

在上述输出中,元素或元组没有按任何特定顺序排列。

示例 2:下面是使用一组无序元组的实现。

C++

// C++ program to illustrate the
// implementation of unordered set of
// tuples
#include 
using namespace std;
   
// Hash function
struct hashFunction
{
  size_t operator()(const tuple&x) const
  {
    return get<0>(x) ^ std::get<1>(x) ^ std::get<2>(x);
  }
};
  
// Function to print unorderedSet elements
void print(unordered_set, hashFunction > &unorderedSetOfTuples)
{
  // Iterating over unorderedSetOfTuples elements
  for (auto currentTuple : unorderedSetOfTuples)
  {
    // Each element is a tuple itself of 
    // bool type
    tuple tp = currentTuple;
  
    cout << "[ ";
  
    // Printing tuple elements
    cout << get<0>(tp) <<
            " , " << get<1>(tp) <<
            " , " << get<2>(tp) ;
    cout << " ]";
  
    cout << "\n";
  }
  
}
  
// Driver code
int main()
{
  // Declaring a unordered set of tuples
  unordered_set, hashFunction > unorderedSetOfTuples;
  
  // Initializing tuples of bool type
  tuple tuple1;
  tuple1 = make_tuple(0, 1, 1);
  
  tuple tuple2;
  tuple2 = make_tuple(1, 1, 1);
  
  tuple tuple3;
  tuple3 = make_tuple(0, 1, 1);
  
  tuple tuple4;
  tuple4 = make_tuple(0, 0, 0);
  
  tuple tuple5;
  tuple5 = make_tuple(1, 1, 0);
  
  tuple tuple6;
  tuple6 = make_tuple(0, 1, 1);
  
  // Inserting into the unordered set
  unorderedSetOfTuples.insert(tuple1);
  unorderedSetOfTuples.insert(tuple2);
  unorderedSetOfTuples.insert(tuple3);
  unorderedSetOfTuples.insert(tuple4);
  unorderedSetOfTuples.insert(tuple5);
  unorderedSetOfTuples.insert(tuple6);
  
  // Calling print function
  print(unorderedSetOfTuples);
  return 0;
}

输出:

解释:

在上述输出中,元素也没有按任何特定顺序排列。这证实了在无序集合中,键以随机方式散列到散列表的索引中。此外,tuple3 和 tuple6 具有相同的布尔值集合,这就是为什么集合中只存在一个元组副本的原因。