2017-04-07 1 views
0

저는 C++을 처음 사용하는데 도움이 필요합니다. 내 문제는 내 구조 해시 쌍 배열을 구현하려고, 거기에 키 및 데이터입니다. 이 구조에서는 hasNext와 next 메소드를 가진 구조체 반복자를 중첩했습니다. 중첩 된 구조에서 내 배열을 (이 배열 부모입니다) 볼 수 없기 때문에 나는 생성자를 통해 전달해야하지만 "...에서 변환 할 수 없습니다 ...", 문제는 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]; 

당신은 당신이 원하는 아마하지 Par 구조에 대한 포인터의 크기 Size의 배열을 선언합니다.

나중에이 배열을 생성자 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

@ JanMesarc 다른 옵션이 있습니다 :'iterator' 생성자의 선언을'Par **'를 받아들이도록 변경하고'index'와'pomPar'와 같은 변경을하십시오. – alexeykuzmin0

+0

고맙습니다. –