Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在c+中实现线性探测+;对于泛型类型 我想在C++中实现HASTABE的线性探测,但是它的关键是 pair将是泛型类型,如:vector(其中key,value是泛型类型)_C++_Templates_Hashtable_Linear Probing - Fatal编程技术网

在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