這是在實現一個迭代器std::list<std::vector<char>>
第一次嘗試:自定義迭代器不取消引用問題
Document.h
#ifndef Document_h
#define Document_h
//-------------------------------------------------------------------------
typedef std::vector<char> Line; // line of text
//-------------------------------------------------------------------------
class Text_iterator
{
public:
Text_iterator(std::list<Line>::iterator l, Line::iterator p)// constructor
: ln(l), pos(p) { }
Text_iterator(const Text_iterator& src) // copy constructor
: ln(src.ln), pos(src.pos) { }
Text_iterator& operator= (const Text_iterator& src) // copy assignment
{
Text_iterator temp(src);
this->swap(temp);
return *this;
}
char& operator*() { return *pos; } // dereferencing
Text_iterator& operator++() // incrementation
{
++pos;
if (pos == ln->end())
{
++ln;
pos = ln->begin();
}
return *this;
}
bool operator== (const Text_iterator& other) const // comparison
{
return ln == other.ln && pos == other.pos;
}
bool operator != (const Text_iterator& other) const // comparison
{
return !(*this == other);
}
void swap(Text_iterator& src) // helper: swap
{
std::swap(src.get_line(), ln);
std::swap(src.get_column(), pos);
}
std::list<Line>::iterator get_line() { return ln; } // accessors
Line::iterator get_column() { return pos; }
private:
std::list<Line>::iterator ln; // data members
Line::iterator pos;
};
//-------------------------------------------------------------------------
void swap (Text_iterator& lhs, Text_iterator& rhs) // object swap
{
lhs.swap(rhs);
}
//-------------------------------------------------------------------------
class Document
{
public:
typedef Text_iterator iterator;
public:
Document() // constructor
{
Line l(10, 'a');
text.push_back(l);
}
iterator begin() // iterator to first element
{
return iterator(text.begin(), (*text.begin()).begin());
}
iterator end() // iterator to last element
{
return iterator(text.end(), (*text.end()).end());
}
void print()
{
for (Document::iterator p = begin(); p != end(); ++p)
{
std::cout << *p;
getchar();
}
}
std::list<Line> text; // data member
};
#endif
main.cpp
#include <iostream>
#include <sstream>
#include <vector>
#include <list>
#include <algorithm>
#include "Document.h"
int main()
{
Document text;
text.print();
}
預期輸出:
AAAAAAAAAA
代替上述期望輸出的獲取:
調試斷言失敗
表達:列表迭代器不dereferencable。
爲什麼我得到這種行爲以及如何糾正?
注:短暫的研究之後,我發現,最常見的原因爲這樣的行爲是在提領該end()
迭代器的嘗試,但我無法找到我的代碼這樣的表達。
您的迭代器需要存儲每個容器的結尾以及開始。 –