带有find函数的C ++ HashTable问题

时间:2016-11-21 00:56:43

标签: c++ hashtable

我正在尝试在这里编码HashTable。我几乎编写了所有函数,程序正在编译。但是由于某些原因,我发现它的功能永远与我的主力一起运行。此外,当测试复制构造函数和运算符=程序崩溃时。下面是哈希表

structure 
{
    struct Record
    {
        TYPE data_;
        string key_;
        Record* Next ;

        Record(const string& key, const TYPE& data)
        {
            key_ = key;
            data_ = data;
        }
        Record()
        {
            key_  = "" ;
            Next = nullptr;
        }



    };
    int TableSize ;
    Record** records ;


    template <class TYPE>
    bool HashTable<TYPE>::find(const string& key, TYPE& value)
    {
        // int index = std::hash<TYPE> {}(value)%TableSize ;
        int index = std::hash<string> {}(key)%TableSize ;
        Record* temp = records[index] ;
        while(temp != nullptr )
        {
            if(temp->data_ == value && temp->key_ == key)
                return true ;
            temp = temp->Next ;
        }
        return false ;
    }

operator= 

    template <class TYPE>
    const HashTable<TYPE>& HashTable<TYPE>::operator=(const HashTable<TYPE>& other)
    {
        if(this != &other)
        {
            if(records)
            {
                for(int i = 0 ; i < TableSize; i++)
                    remove(records[i]->key_);
                delete[] records ;
            }
            records = new Record*[other.TableSize] ;
            TableSize = other.TableSize ;
            for(int i = 0 ; i < other.TableSize ; i++)
            {
                update(records[i]->key_, records[i]->data_);

            }

        }

        return *this;

    }

    template <class TYPE>
    HashTable<TYPE>::HashTable(const HashTable<TYPE>& other)
    {
        if(other.records != nullptr)
        {
            if(records)
            {

                delete[] records ;
                cout<<"delete"<<endl;

            }

            records = new Record*[other.TableSize];



            TableSize = other.TableSize;
            for(int i = 0 ; i < other.TableSize; i++)
                records[i] = new Record();

            for (int i = 0; i<other.TableSize; i++)
            {
                update(other.records[i]->key_, other.records[i]->data_);
            }

        }
        else
        {
            records = nullptr;
        }

    }

1 个答案:

答案 0 :(得分:0)

HashTable<TYPE>::HashTable(const HashTable<TYPE>& other)
{
    // ...
        if (records) {
            delete[] records ;

没有可以做到这一点的情况。

你正在构建一个新对象,你还没有初始化它的任何成员(这本身就是不好的做法)。使用某些东西的价值,你有责任初始化已经很糟糕了,但删除碰巧在那里发生的任何垃圾都可能是灾难性的。

operator=中确实有意义,因为对象已存在。