我正在寻找洞察HashSet设计师的头脑.据我所知,我的问题适用于Java和C#HashSets,让我觉得必须有一些很好的理由,尽管我自己也想不到.
在我将项目插入HashSet之后,为什么在没有枚举的情况下检索该项目是不可能的,几乎不是有效的操作?特别是因为HashSet以支持有效检索的方式显式构建.
使用Remove(x)和Contains(x)返回正在删除或包含的实际项目通常很有用.这不一定是我传递给Remove(x)或Contains(x)函数的项目.当然,我想我可以通过HashMap实现同样的效果,但是为什么在完全有可能用套装完成时却浪费了所有的空间和努力?
我可以理解,可能存在一些设计问题,即添加此功能将允许使用HashSet,这与其角色或框架中的未来角色不一致,但如果是这样,那么这些设计问题是什么?
编辑
要回答更多问题,请参阅以下详细信息:
我使用带有重写的hashcode,equals等的不可变引用类型来模拟C#中的值类型.假设类型有成员A,B和C.Hashcode,equals等仅依赖于A和B.给定A和BI希望能够从hashset中检索该等效项并得到它C.我赢了它似乎可以使用HashSet,但我至少想知道这是否有任何充分的理由.伪代码如下:
public sealed class X{
object A;
object B;
object extra;
public int HashCode(){
return A.hashCode() + B.hashCode();
}
public bool Equals(X obj){
return obj.A == A && obj.B == B;
}
}
hashset.insert(new X(1,2, extra1));
hashset.contains(new X(1,2)); //returns true, but I can't retrieve extra
Run Code Online (Sandbox Code Playgroud) 我有以下C++函数定义,我试图通过托管代码通过PInvoke调用:
bool FooBar(SIZE_T* arg1);
Run Code Online (Sandbox Code Playgroud)
我的管理声明如下:
[DllImport("mydll", SetLastError=true, CharSet=CharSet.Unicode)]
private static extern bool FooBar(ref uint arg1);
Run Code Online (Sandbox Code Playgroud)
有些人可能会注意到我最终做的同样的错误.这不是64位便携式.SIZE_T的大小可变(32-64位),指针也是如此.在托管大小上,指针正确转换为64位,但uint没有,并且您最终可以在arg1的高位中使用垃圾.这是一个特别持久的错误,因为垃圾通常只是零:(
我已经开始工作的唯一解决方案是以下管理声明:
[DllImport("mydll", SetLastError=true, CharSet=CharSet.Unicode)]
private static extern bool FooBar(ref IntPtr arg1);
Run Code Online (Sandbox Code Playgroud)
这当然有效,因为IntPtr可以正确地改变它的大小.在我的代码中,我只是将IntPtr视为一个整数,它可以工作,虽然它看起来像一个丑陋的黑客.在我看来应该有一些方法来正确指定,也许使用UnmanagedType.SysUInt,但我无法提出任何其他工作解决方案.
是否有这样的依赖模式,不可能只保留头文件中的所有内容?如果我们只对每个标题强制执行一个类的规则怎么办?
出于这个问题的目的,让我们忽略静态的东西:)
关于虚拟基类继承的一些令我困惑的事情......给出以下类:
class A
{
virtual void foo() = 0;
}
class B : virtual A
{
void foo() { /* do X */ }
}
class C : virtual A
{
void foo() { /* do Y */ }
}
class D : B, C
{
}
Run Code Online (Sandbox Code Playgroud)
这会编译吗?如果是这样,以下代码的结果是什么:
D d;
A* a = &d;
a->foo();
Run Code Online (Sandbox Code Playgroud) 基本上标题是什么.我有一个功能:
bool operator< (... lhs, ... rhs)
Run Code Online (Sandbox Code Playgroud)
我想打破.'b operator <(...)'给了我错误:
malformed template specification in command
Run Code Online (Sandbox Code Playgroud)
如何阻止GDB认为<是模板开启者?我也尝试按行号设置断点,但是这个定义是在头文件中,由于某种原因,GDB认为头文件中不存在行号.
GDB 6.8