Итерационная реализация в классе шаблонов Список типов данных.Перечислить реализацию итератора в реализации карты - проблема
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, тогда я бы не смог его повторить. Как мне это обработать?
Примечание: вы должны реализовать итератор с точки зрения указателя - не проверяйте достоверность (просто позвольте программе сбой) и не сравнивайте контент (просто сравните адреса указателя). Кроме того, продвигайте указатель, если хотите, и дайте программе денежные средства (если этот аванс недействителен). –
Я чувствую, что некоторые детали здесь отсутствуют. Что вы даже подразумеваете под '* at'? Я не вижу этого в вашем коде. Пожалуйста, предоставьте [mcve] – AndyG
Возможно опечатка для '* it'? – Barmar