哈希表搜索函数使用向量在c++中
Hash table search function using Vectors in C++
我正在尝试使用向量制作哈希表,或者最好使用带有结构的表?
vector<int>*hashtable = new vector<int>[m];
for(int i = 0; i<N; i++){
temp = T1[i] % m;
hashtable[temp].push_back(T1[i]);
for (int i = 0; i <= T2[0]; i++){
valuefound = 0;
std::vector<int>::iterator it;
for (it = hashtable[i].begin(); it != hashtable[i].end(); ++it){
if(T2[i+1] == *it){
T3HS[i] = i;
valuefound = 1;
}
}
}
这个问题可以更好地改写为:两个表中都存在两个值。似乎你试图让T3HS保存已找到元素的索引。
代码:for (int i = 0; i <= T2[0]; i++){
}
要循环遍历vector,我总是使用:
for (int i = 0; i <= T2.length(); i++){
}
有N
或N+1
哈希表向量,但您只查看其中的T2[0]
。
顺便说一下,当i
为T2[0]
时,您的搜索模式循环将访问T2
数组的末尾,T2[i+1]
。
需要一段时间才能到达那里,所以请耐心等待。
for (int i = 0; i < N; i++)
{
temp = T1[i] % m;
hashtable[temp].push_back(T1[i]);
}
将数字分类到箱子中并存储它们。Groovy。这里没有问题。但这:
std::vector<int>::iterator it;
for (it = hashtable[i].begin(); it != hashtable[i].end(); ++it)
{
if (T2[i + 1] == *it)
{
T3HS[i] = i;
valuefound = 1;
}
}
不会在这些箱子里寻找数字。到处都是。你要做的就是在正确的箱子里找。
int searchval = T2[i + 1]; // cache the number we're looking for. Easier debugging
int binindex = searchval % m; // get the bin for this number
std::vector<int>::iterator it;
// now we look just in that one bin.
for (it = hashtable[binindex].begin(); it != hashtable[binindex].end(); ++it)
{
if (searchval == *it)
{
T3HS[i] = i;
valuefound = 1;
break;// found it . Stop looking.
}
}
在此之后,有大量的小改进:
从基于范围的for循环
开始 int searchval = T2[i + 1];
int binindex = searchval % m;
for (int val: hashtable[binindex])
{
if (searchval == val)
{
T3HS[i] = i;
valuefound = 1;
break;
}
}
接下来,将搜索算法删除并将其放入自己的函数中。这样可以去除像valuefound
这样的箔条。函数返回值是否被找到。一个函数应该做一件事,而且只能做一件事。有时,一件事是聚合了许多其他功能。首先,考虑为什么要在搜索函数中构建哈希表。用一个函数来创建哈希表,用另一个函数来搜索哈希表更有意义。两个函数都只做一件事。作为一个额外的好处,将它们分开意味着您可以在多个搜索中重用哈希表。
bool search (int searchval, vector<int>*hashtable, int m)
{
int binindex = searchval % m;
for (int val: hashtable[binindex])
{
if (searchval == val)
{
return true;
}
}
return false;
}
命名为
for (int i = 0; i <= T2[0]; i++)
{
if (search(T2[i+1], hashtable, m))
{
T3HS[i] = i;
}
else
{
T3HS[i] = -1;
}
}
然后再往外一点填充所有的内存泄漏,比如
int *T3HS = new int[T2[0]];
和
vector<int>*hashtable = new vector<int> [m];
with vectors
。永远不要new
,除非你绝对必须这样做,因为你必须new
,你必须delete
,并且弄清楚何时何地删除东西可能是一个痛苦的屁股。让编译器为你做。
接下来,有一组描述哈希表的函数和数据。不妨把所有这些都打包到hashtable
类中。
最后想想你是如何使用hashtable
的。你想让它简单明了。您不会想要一个长达一页的注释来解释T2[0]
包含列表的长度,并且必须始终不大于列表长度的1。你只知道有人会读错。是你让120programalarm犯了这个错误,他们可不是傻瓜。您最好使用另一个包含长度的变量,或者再次使用vector
,因为它知道它的长度。
你做的东西越容易使用,它被误用的可能性就越小。
- 写入向量<向量<bool>>
- 函数向量_指针有不同的原型,我可以构建一个吗
- std::向量与传递值的动态数组
- 将值指定给向量(2D)的向量中的某个位置
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 如何使用向量的template_back函数
- 尝试通过多个向量访问变量时,向量下标超出范围
- 如何通过派生类函数更改基类中的向量
- C++从另一个类访问公共静态向量的正确方法是什么
- 如何将ampl中的集合表示为c++中的向量
- 变量没有改变?通过向量的函数调用
- 迭代时从向量和内存中删除对象
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 计算排序向量的向量中唯一值的计数
- 矩阵向量乘法(cublasDgemv)返回零
- 一对向量构造函数:初始值设定项列表与显式构造
- 将结构向量排序为子组
- 在C++中调整向量中的索引
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么