c ++中的哈希表错误

时间:2017-08-01 22:43:24

标签: c++ list vector hashtable

我编写了一个简单的程序,用于在Hash Table中插入数据,并使用C ++语言从中删除数据。我的程序错误是:未定义引用' HashTable :: insert(int&)' 如何解决此错误?

#include <iostream>
#include <list>
#include <vector>

using namespace std;

我创建一个模板以提供所有变量。

template <typename HashedObj>
class HashTable {
public:
    explicit HashTable(int cusize = 101) {}

    bool contains(const HashedObj& x) const
    {
        auto& whichList = theLists[myhash(x)];
        return find(begin(whichList), end(whichList), x) != end(whichList);
    }

    void makeEmpty()
    {
        for (auto& thisList : theLists)
            thisList.clear();
    }

    bool insert(const HashedObj& x)
    {
        auto& whichList = theLists[myhash(x)];
        if (find(begin(whichList), end(whichList), x) != end(whichList))
            return false;
        whichList.push_back(x);

        //Rehash
        if (++currentSize > theLists.size())
            rehash();

        return true;
    }

    bool insert(HashedObj& x);
    bool remove(const HashedObj& x)
    {
        auto& whichList = theLists[myhash(x)];
        auto itr = find(begin(whichList), end(whichList), x);

        if (itr == end(whichList))
            return false;

        whichList.erase(itr);
        --currentSize;
        return true;
    }


private:
    vector<list<HashedObj>> theLists; //The array of Lists
    int currentSize;

    void rehash();
    size_t myhash(const HashedObj& x) const
    {
        static hash<HashedObj> hf;
        return hf(x) % theLists.size();
    }
};

在main函数中,我创建一个带有int变量的HashTable,并向其插入10个数字,但编译器在插入函数的 test = t.insert(i); 时出错。

int main()
{
    HashTable<int> t;

    bool test;
    for (int i = 0; i < 10; i++) {
        test = t.insert(i);
    }
}

2 个答案:

答案 0 :(得分:2)

您的代码中似乎有两个bool insert(params)函数:

 bool insert(const HashedObj& x)
{
    auto& whichList = theLists[myhash(x)];
    if (find(begin(whichList), end(whichList), x) != end(whichList))
        return false;
    whichList.push_back(x);

    //Rehash
    if (++currentSize > theLists.size())
        rehash();

    return true;
}

在这里:

bool insert(HashedObj& x);

删除其中一个。

编辑:正如@DietmarKühl建议的那样,你应该删除第二个实现。

答案 1 :(得分:0)

您声明了两个insert个函数,第一个函数使用了const HashedObj&个参数,第二个函数使用了HashedObj&个参数。

test = t.insert(i); i这里是一个非const变量,所以它匹配第二个插入函数,但你没有实现它。

如果删除第二个insert声明,它可以很好地工作,因为编译器会自动将i转换为const int&类型。