2017-04-07 215 views
0

我是C++世界的新手,我需要帮助。我的问题是我尝试实现我的结构散列对数组,有关键和数据。在这个结构中,我使用方法hasNext和next嵌套了结构迭代器。因为我不能从嵌套结构中看到我的数组(这个数组在父类中),所以我需要通过构造函数传递它,但是出现错误“:can not convert from ...”,问题是在方法getIterator中传递_array。代码如下。你可以帮帮我吗?由于带有hasNext和Next的C++迭代器

#pragma once 
template<typename T, typename U, int Size, int(*HashFunction)(T)> 
struct HashPairPole { 

// Pair - key - data 
struct Par { 
    // key 
    T _first; 
    // data 
    U _second; 
    // list for collision records 
    Par* _overflow; 

    Par(T t, U u) { 
     _first = t; 
     _second = u; 
     _overflow = nullptr; 
    } 
}; 


HashParovePole() {} 

// Static array for save data 
Par* _array[Size]; 

// Add record into hash table 
void add(T t, U u) { 
    // calculating of index  
    Par* prvek; 
    int idx = HashFunction(t) % Size; 

    // Element will be saved in _array[idx], if it is free, else will be 
    //saved to list (->_overflow) 
    prvek = new Par(t, u); 

    if (_array[idx] == nullptr) { 
     _array[idx] = prvek; 
    } 
    else { 
     prvek->_overflow = _array[idx]; 
    } 
    _array[idx] = prvek; 
} 

// Get data from hash tabule 
U& get(T t) { 
    int idx = HashFunction(t) % Size; 
    Par * prvni = _array[idx]; 

    while (prvni->_overflow != nullptr) { 
     if (prvni->_first == t) { 
      return prvni->_second; 
     } 
     prvni = prvni->_overflow; 
    } 

} 

U& operator[](T t) { 
    return get(t); 
} 

U operator[](T t) const { 
    const U temp = get(t); 
    return temp; 
} 

// Iterator for walking all hash table 
struct iterator { 
    Par* index[Size]; 
    Par* pomPar; 
    int temp = 0; 

    iterator(Par * _array) { 
     index = _array; 
     pomPar = index[0]; 
    } 

    bool hasNext()const { 
     return pomPar != nullptr; 
    } 


    std::pair<T, U> next() { 
     std::pair<T, U> data; 
     if (hasNext()) { 
      data.first = pomPar->_first; 
      data.second = pomPar->_second; 
      pomPar = pomPar->_overflow; 
     } 
     temp++; 
     pomPar = index[temp]; 
     return data; 
    } 
}; 

    // Vytvori iterator 
    iterator getIterator() { 
     return iterator(_array); 
    } 

}; 
+0

在哪行中有汇编错误?什么是编译错误的文本?请阅读FAQ并发布MCVE:http://stackoverflow.com/help/mcve – alexeykuzmin0

+1

'Par * _array!= Par * index [Size]'。 – NathanOliver

+1

关闭主题,但...我猜'HashParovePole(){}'应该是'HashPairPole(){}'? –

回答

0

据我看到的,问题是在这一行:

Par* _array[Size]; 

在这里,您声明指向的大小Size的数组Par结构,这可能不是你想要的。

稍后尝试将此数组传递给构造函数iterator(Par * _array),该构造函数接受指向Par结构的指针,这是不可能的。

我会以下列方式解决这个代码:

Par _array[Size]; // Instead of Par* _array[Size] 
        // You need an array of structures instead of array of pointers 
... 
Par* index; // Instead of Par* index[Size] 
      // Here looks like index is a pointer to a current element 
... 
pomPar = index; // Instead of pomPar = index[0]; 
       // This is a pointer to the node, while index[0] is its value 

而且,考虑使用std::vector而不是原始指针。它会为你处理内存管理问题。

+0

我无法将Par * _array更改为Par _array,因为我必须遵守教师的任务。我需要用这个迭代器来实现这个容器,因为来自老师的源代码使用这种方法,不幸的是我不能改变我在学校里得到的源代码。 –

+1

@JanMesarčOK,还有另一种选择:改变'iterator'构造函数的声明接受'帕**'和'与和index''pomPar'做同样的改变。 – alexeykuzmin0

+0

谢谢你,这是伟大的工作:) –