【发布时间】: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;
}
【问题讨论】:
-
指针仍然存在,但这并不能告诉你它们是否同时被删除
这可能很容易,但到目前为止我还没有找到解决方案。 这就是我想做的……
int a[] = {1,2,3};
int b[] = {1,2,3};
set<int*>S;
S.insert(a);
if(S.count(b))
{
cout<<"Job Done!"<<endl;
}
【问题讨论】:
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==b 和 S.count(b) 将返回 1。
比较 一个二元谓词,它接受两个与元素相同类型的参数并返回一个布尔值。表达式 comp(a,b),其中 comp 是这种类型的对象,a 和 b 是键值,应 如果在严格的弱中认为 a 在 b 之前,则返回 true 排序函数定义。 set 对象使用这个表达式来 确定元素在容器中遵循的顺序和 两个元素键是否相等(通过比较它们 反身:如果 !comp(a,b) && !comp(b,a)),它们是等价的。没有两个 集合容器中的元素可以是等价的。这可以是一个函数 指针或函数对象(有关示例,请参见构造函数)。这 默认为 less,它返回与应用小于相同的值 运算符(一个
【讨论】:
std::set<std::array<int,3>> 或std::set<vector<int>> 可能更好。
int 的指针,那么定义这样的函数很容易。
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;
}
【讨论】: