我将如何处理这些返回类型错误? (散列映射/表)

时间:2015-02-20 22:53:55

标签: c++11 hashmap hashtable

#ifndef HASHMAP_H
#define HASHMAP_H
#include <iostream>
#include <string>
#include <vector>

using namespace std;

enum Status{open , active, deactivated };

//template <typename T>


template</*typename Key,*/ typename T>
class hashmap{
private:
    class Node{
    public:
        const string Key;
        //vector<T> values;
        T value;
        Status status;
        Node(string key, T val) :Key(key), value(val), status(active){}

        void operator =(const Node &n){
            string *ptr;
            ptr = (string*)(&(this->Key));
            *ptr = n.Key;
            //Node(n);
            this->status = n.status;
            this->value = n.value;
        }
        Node() :status(open){}

        Node(const string& key) :Key(key), status(active){}
        //Node(const Node &n) : value(n.val), status(n.status){}


    };
    //typedef map<
    unsigned int hash(const string& s, int tableSize){
        unsigned int h = 0; 
        /*each(s)*/ 
        for(auto it : s) h = 31 * h + unsigned(it);
        return h % tableSize;
    }

    unsigned int hash(const string& s){
        return hash(s, table_size);
    }

    int table_size = 103;
    vector<Node> table;

    typedef typename vector<Node>::iterator iter;

public:
    //default constructor
    hashmap(){
        table = vector<Node>(table_size);
    }
    //copy constructor
    hashmap(const hashmap& x){
        table = x.table;
        //for (auto it = )
    }
    //assignment operator //has been removed
    hashmap& operator=(const hashmap& x){
        this->table.erase(this->table.begin(), this->table.begin() + 103);
        for ( int i = 0; i < x.table_size; i++){
            this->table.push_back(x.table.at(i));
        }
        return *this;
    }
    //destructor
    ~hashmap(){
        table.clear();
    }

    //index operator
    T& operator[](const string x){
        int h = hash(x, table.size());

        if (table[h].Key == x){
            return (table[h].value);
        }
        else {
            Node* n = new Node(x);
            table[h] = *n; 
            return (table[h].value);
        }
    } 

    //Node test
    void okay(const string x,int i){
        Node *temp = new Node(x, i);
        cout << temp->status << endl;
        /*cout << table[1].status << endl;
        cout << table[2].status << endl;
        table.at(0) = (*temp);
        cout << table[0].Key << endl;
        cout << table[0].value << endl;
        cout << table[3].status << endl;*/

    }

int stride(int x){
            return (7-x%7);
        }

    //find()
    iter find(const string& x){
        int h = hash(x);
        int s = stride(h);
        int t = table_size; 
        int z;
        //for (int i = 0; i < t; i++){
        for (int i = hash(x, table_size) % t; i != t; i = (i + stride(h)) % t){
            z = (h + i*s) % table_size;
            if (table[z].status == open) return NULL;
            if (table[z].status == deactivated) continue;
            if (table[z].Key == x) return &table[h];
        }

        return table.end();
    }

    //begin()
    iter begin(){
        return table.begin();
    }
    //end()
    iter end(){
        return table.end();
    }

};



#endif // !HASHMAP_H

除了find函数之外,一切似乎都运行良好。它假设通过向量探测并在条件下返回值,但我遇到的问题是我得到关于返回类型冲突的这些错误。

    Error2error C2664: 'std::_Vector_iterator<std::_Vector_val<std::_Simple_types<hashmap::Node>>>::_Vector_iterator(const 
std::_Vector_iterator<std::_Vector_val<std::_Simple_types<hashmap::Node>>> &)' : cannot convert argument 1 from 'hashmap<int>::Node *' to 'const 
std::_Vector_iterator<std::_Vector_val<std::_Simple_types<hashmap<int>::Node>>> &' 

    Error1error C2664: 'std::_Vector_iterator<std::_Vector_val<std::_Simple_types<hashmap<int>::Node>>>::_Vector_iterator(const 
std::_Vector_iterator<std::_Vector_val<std::_Simple_types<hashmap<int>::Node>>> &)' : cannot convert argument 1 from 'int' to 'const 
std::_Vector_iterator<std::_Vector_val<std::_Simple_types<hashmap<int>::Node>>> &' 

如何编辑迭代器来解决这个问题? 谢谢。

0 个答案:

没有答案