【问题标题】:Is it possible for c++(98) STL set to hash an array of int and later check to see whether the array is present in the set or notc++(98) STL set 是否可以散列一个 int 数组,然后检查该数组是否存在于集合中
【发布时间】:2015-08-18 17:38:30
【问题描述】:

这可能很容易,但到目前为止我还没有找到解决方案。 这就是我想做的……

int a[] = {1,2,3};
int b[] = {1,2,3};

set<int*>S;

S.insert(a);    

if(S.count(b))
{
    cout<<"Job Done!"<<endl;
}

【问题讨论】:

  • 指针仍然存在,但这并不能告诉你它们是否同时被删除

标签: c++ arrays stl set


【解决方案1】:

std::set 是一个有序容器。一旦您将int* 插入其中,它将保存“地址”。在您的示例中,它将保存数组a 的第一个元素的地址。 S.count(b) 将返回 0,因为 b 的地址不等于 a 的地址。

std::set的定义使得第二个参数可以是定义“比较”操作的方法(link):

template <
       class T,                        // set::key_type/value_type
       class Compare = less<T>,        // set::key_compare/value_compare
       class Alloc = allocator<T>      // set::allocator_type
> set;

因此,如果您编写一个函数来定义两个 int* 之间的“std::set<int*>::find 将通过应用 @987654333 来检查 a==b 是否@。如果它将返回 true,则 a==bS.count(b) 将返回 1。

比较 一个二元谓词,它接受两个与元素相同类型的参数并返回一个布尔值。表达式 comp(a,b),其中 comp 是这种类型的对象,a 和 b 是键值,应 如果在严格的弱中认为 a 在 b 之前,则返回 true 排序函数定义。 set 对象使用这个表达式来 确定元素在容器中遵循的顺序和 两个元素键是否相等(通过比较它们 反身:如果 !comp(a,b) && !comp(b,a)),它们是等价的。没有两个 集合容器中的元素可以是等价的。这可以是一个函数 指针或函数对象(有关示例,请参见构造函数)。这 默认为 less,它返回与应用小于相同的值 运算符(一个

【讨论】:

  • 好吧,在不知道实际数组大小的情况下很难编写比较函数。使用std::set&lt;std::array&lt;int,3&gt;&gt;std::set&lt;vector&lt;int&gt;&gt; 可能更好。
  • @πάντα ῥεῖ 你是对的,使用 std::vector(或 std:array)会更好更安全。但是根据示例@Shafiq Islam 想要使用本机数组。因此,如果按照设计,他知道数组的大小始终为 3(如示例中所示)并且只有数组存储在集合中,而不是每个可能的指向 int 的指针,那么定义这样的函数很容易。
【解决方案2】:

c++(98) STL 设置是否可以散列 int 及更高版本的数组 检查数组是否存在于集合中

这是可能的,因为 std::set 的第二个模板参数允许指定自定义比较器。然而,当“Key”参数是 int* 类型时,不可能做到这种类型安全,因为无法确定大小。

在 c++11 中,他们引入了 std::array 类型,它基本上创建了一种类型的数组,其类型由项目类型和数组大小决定。它还覆盖了对所有项目执行字典比较的运算符

如果您不能使用 c++11,您可以查看 boost 库或查找适用于 c++98 的 array 的 Nicolai Josuttis 实现:

#include <iostream>
#include <set>
#include <array>
#include <cassert>

int main() 
{
  typedef std::array<int,3> IntArray;
  typedef std::set<IntArray> IntArraySet;

  IntArray a = {1,2,3};
  IntArray b = {1,2,3};

  IntArraySet set;
  set.insert(a);
  set.insert(b);

  assert(set.size() == 1);

  IntArray c = {1,2,4};
  set.insert(c);
  assert(set.size() == 2);

  return 0;
}

【讨论】:

    猜你喜欢
    • 2016-05-28
    • 2018-06-27
    • 1970-01-01
    • 1970-01-01
    • 2021-07-17
    • 2021-04-03
    • 2022-01-04
    • 2021-12-15
    相关资源
    最近更新 更多