在c+中实现线性探测+;对于泛型类型 我想在C++中实现HASTABE的线性探测,但是它的关键是 pair将是泛型类型,如:vector(其中key,value是泛型类型)
现在,在线性探测中,如果一个单元被占用,我们将遍历向量,直到找到一个空单元,然后将新的一对放置在该单元中 问题是,在泛型类型中,如何检查特定单元格是否已被占用? 我不能使用这些条件:在c+中实现线性探测+;对于泛型类型 我想在C++中实现HASTABE的线性探测,但是它的关键是 pair将是泛型类型,如:vector(其中key,value是泛型类型),c++,templates,hashtable,linear-probing,C++,Templates,Hashtable,Linear Probing,现在,在线性探测中,如果一个单元被占用,我们将遍历向量,直到找到一个空单元,然后将新的一对放置在该单元中 问题是,在泛型类型中,如何检查特定单元格是否已被占用? 我不能使用这些条件: if(key == '\0')//As key is not of type string 或 if(key == 0)//As key is not of type int 那么,我们如何才能检查载体中的壁细胞是否为空? 如果我误解了这个概念,请纠正我。我认为您可以检查向量的元素是否具有有意义的键和值: i
if(key == '\0')//As key is not of type string
或
if(key == 0)//As key is not of type int
那么,我们如何才能检查载体中的壁细胞是否为空?
如果我误解了这个概念,请纠正我。我认为您可以检查向量的元素是否具有有意义的键和值:
if(vector[i] == std::pair<key, value>())
//empty
这种方法假定
key
类型的默认构造函数构造一个对象,该对象将被视为“空”或“无效”键。我认为您可以检查向量的元素是否具有有意义的键和值:
if(vector[i] == std::pair<key, value>())
//empty
此方法假定
键类型的默认构造函数构造的对象将被视为“空”或“无效”键。您可以使用自由函数isEmpty
检查键类型是否为空。定义适用于大多数类型的模板化默认函数,并生成默认情况下无法处理的特殊函数
例如
模板
布尔岛空(康斯特T&T){
返回!t;
}
bool isEmpty(const std::string&s){
返回s.length()==0;
}
布尔空(双d){
返回d<0;
}
isEmpty(0);//真的
isEmpty(1);//假的
isEmpty(std::string());//真的
isEmpty(std::string(“notempty”);//假的
isEmpty(1.0);//假的
isEmpty(-1.0);//真的
您只需要专门化没有运算符的键类型
或在检查需要不同逻辑的地方可以使用自由函数isEmpty
检查密钥类型是否为空。定义适用于大多数类型的模板化默认函数,并生成默认情况下无法处理的特殊函数
例如
模板
布尔岛空(康斯特T&T){
返回!t;
}
bool isEmpty(const std::string&s){
返回s.length()==0;
}
布尔空(双d){
返回d<0;
}
isEmpty(0);//真的
isEmpty(1);//假的
isEmpty(std::string());//真的
isEmpty(std::string(“notempty”);//假的
isEmpty(1.0);//假的
isEmpty(-1.0);//真的
您只需要专门化没有运算符的键类型如果您不想排除散列中有“默认构造”元素的可能性,那么您可以构建一个并行数据结构,如std::bitset
(如果您事先知道数据结构的最大大小)或std::vector
,在下面我将调用has
<如果vector[i]
包含有效的、实际插入的元素,则code>has[i]
将为真
因此,操作应修改如下:
- 插入:继续扫描向量,直到找到一个位置
,从而i
具有[i]==false
- 删除位置i中的元素:将
设置为的[i]
false
希望这对您有所帮助如果您不想排除散列中存在“默认构造”元素的可能性,您可以构建一个并行数据结构,如
std::bitset
(如果您事先知道数据结构的最大大小)或std::vector
,在下面我将调用has<如果vector[i]
包含有效的、实际插入的元素,则code>has[i]将为真
因此,操作应修改如下:
- 插入:继续扫描向量,直到找到一个位置
,从而i
具有[i]==false
- 删除位置i中的元素:将
设置为的[i]
false
希望这有帮助您可以专门化包含该代码的函数。您可能需要另一个知道自身是否为“空”的数据结构。但是如何专门化该函数?将额外的标志与单元格关联,最好是作为压缩位数组。您不能。有一些事情C++不允许你做。当然,您可以构建一个并行的标志数组,但这并不能真正回答问题。您只能要求模板类型支持某种描述的“isnull”方法,然后代码不是泛型的。您可以专门化包含该代码的函数。您可能需要另一个知道自身是否为“空”的数据结构。但是如何专门化函数?将额外的标志与单元格关联,最好是一个压缩的位数组。你不能。有一些事情C++不允许你做。当然,您可以构建一个并行的标志数组,但这并不能真正回答问题。您只能要求模板类型支持某种描述的“isnull”方法,然后代码就不是泛型的。如果
key
或value
没有默认值,会发生什么情况?例如,一个int
?@FatihBAKIR,他们为什么不呢?在这种情况下,int将被初始化为0。当然,这种方法假定key
类型的默认构造函数创建了一个对象,该对象被认为是空的或无效的键。编辑答案以强调这一点。@SingerOfTheFall,我是否应该为向量的每个索引创建一个空对(在构造函数中)?这是否会限制向量的大小应该事先知道。@Saurabh,不一定。您只需要确保当向量中的元素被删除时,您要么1)真的从向量中删除它,要么2)
template<typename T>
bool isEmpty(const T &t) {
return !t;
}
bool isEmpty(const std::string &s) {
return s.length() == 0;
}
bool isEmpty(double d) {
return d < 0;
}
isEmpty(0); // true
isEmpty(1); // false
isEmpty(std::string()); // true
isEmpty(std::string("not empty")); // false
isEmpty(1.0); // false
isEmpty(-1.0); // true