2016-01-12 2 views
0

Итерационная реализация в классе шаблонов Список типов данных.Перечислить реализацию итератора в реализации карты - проблема

template <DataType> 
class List{ 
     ... 

    class myIterator 
    { 
    public: 
     typedef myIterator self_type; 
     typedef Node<DataType>* pointer; 

     myIterator(pointer ptr) : ptr_(ptr) { } 
     self_type operator++() { 
      self_type i = *this; 
      if (ptr_) ptr_ = ptr_->Next(); 
      return i; 
     } 
     int operator*() { if (ptr_) return ptr_->Data(); else return 0; } 
     bool operator==(const self_type& rhs) { 
      if (!ptr_ && !rhs.ptr_) return true; 
      return (ptr_ && rhs.ptr_ && rhs.ptr_->Data()==ptr_->Data()); 
     } 
     bool operator!=(const self_type& rhs) { 
      return !(*this==rhs); 
     } 
    private: 
     pointer ptr_ = nullptr; 
    }; 

    myIterator begin() { return myIterator(head); } 
    myIterator end() { return myIterator(nullptr); } 
}; 

Использование:

void remove(const KeyType& key) { 
      if (!this->containsKey(key)) { 
       return; 
      } 
      for (List<Pair, CompareFunction>::myIterator it = this->_pairs.begin(); 
      it != this->_pairs.end(); ++it) { 
       Pair cur_pair = *it; 
       if (cur_pair.first == key) { 
        this->_pairs.Delete(cur_pair); 
        this->_size--; 
       } 
      } 
     } 

Соответствующий код заголовка этого FUNC:

template <class KeyType, class ValueType, class CompareFunction = std::less<KeyType> > 
    class MtmMap { 

    public: 
     class Pair { 
     public: 
      Pair() :first(KeyType()) {} //////////////////// 
      Pair(const KeyType& key, const ValueType& value) 
       : first(key), second(value) {} 

      const KeyType first; 
      ValueType second; 

      ~Pair() = default; 

      Pair& operator=(const Pair& pair) { 
       this->second = pair.second; 
       return *this; 
      } 
     }; 

Цель: То, что я пытаюсь сделать в этом цикле, должен итерацию по всему списку и найти пару, в которой ключ такой же, как и заданный, а затем удалить всю пару.

Проблема:

*it 

интерпретируется как INT, который в нашем случае я предполагаю утечки из MtmMap, потому что в моем "главный":

typedef MtmMap<int, int> IntMap; 
typedef IntMap::Pair IntPair; 

IntMap map1(10); 
map1.insert(IntPair(1, 2)); 
map1.remove(1); 

Ошибка:

" cannot convert from "int" to "mtm::MtmMap<int,int,std::less<KeyType>>::Pair" "" 

Редактировать: У меня есть еще одна проблема, которая в следующем фрагменте кода:

const ValueType& operator[](const KeyType& key) const { 
      for (List<Pair, CompareFunction>::myIterator it = this->_pairs.begin(); 
      it != this->_pairs.end(); ++it) { 

В таком использовании итератора, компилятор кричит:

Error C2662 List<mtm::MtmMap<int,int,std::less<KeyType>>::Pair,CompareFunction>::myIterator List<mtm::MtmMap<KeyType,int,CompareFunction>::Pair,CompareFunction>::begin(void): cannot convert 'this' from "const List<mtm::MtmMap<int,int,std::less<KeyType>>::Pair,CompareFunction>" to "List<mtm::MtmMap<int,int,std::less<KeyType>>::Pair,CompareFunction> &" 

Как я понимаю, что здесь проблема с сопзЬ -correctness. Я не могу сделать итератор const, тогда я бы не смог его повторить. Как мне это обработать?

+0

Примечание: вы должны реализовать итератор с точки зрения указателя - не проверяйте достоверность (просто позвольте программе сбой) и не сравнивайте контент (просто сравните адреса указателя). Кроме того, продвигайте указатель, если хотите, и дайте программе денежные средства (если этот аванс недействителен). –

+0

Я чувствую, что некоторые детали здесь отсутствуют. Что вы даже подразумеваете под '* at'? Я не вижу этого в вашем коде. Пожалуйста, предоставьте [mcve] – AndyG

+0

Возможно опечатка для '* it'? – Barmar

ответ

1

Я думаю, что есть некоторые детали отсутствуют, но

int operator*() { if (ptr_) return ptr_->Data(); else return 0; } 

работает только тогда, когда PTR _-> Data() является INT, что вероятно, не ваши намерения. Должно ли возвратное значение быть данным DataType?

+0

Да, это именно та проблема. Теперь мне просто нужно подумать, как вернуть ptrnull, потому что это не DataType eather, компилятор жалуется на это. Но отлично, спасибо. Или, может быть, его можно использовать здесь. – KittyT2016

+0

Hm ...странно, как я могу вернуть объект DataType или nullptr, если подпись является DataType? Какие-либо предложения ? – KittyT2016

+0

Если ptr имеет значение null, вы должны поднять исключение или вернуть значение по умолчанию – ead

Смежные вопросы