模板类中的迭代器实现DataType的列表。
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> &"
据我所知,这里存在const-correctness的问题。我不能使迭代器const,然后我将无法迭代它。我该如何处理?
答案 0 :(得分:1)
我认为缺少一些细节,但
int operator*() { if (ptr_ ) return ptr_->Data(); else return 0; }
仅在ptr _-&gt; Data()为int时才有效,这可能不是您的意图。返回值不应该是DataType吗?