Hier ist ein guter Artikel über das Schreiben Iteratoren:
http://www.aristeia.com/Papers/CUJ_June_2001.pdf
Da die meisten Menschen haben festgestellt, benötigen Sie eine const-Version von begin() und end(), dass ein const_iterator zurückgibt.
Was die meisten Leute vergessen haben ist, dass ein Iterator implizit in einen Const_iterator konvertiert werden kann. Sonst ist es schwierig, einen Const-Iterator von einem Nicht-Kosten-Objekt zu erhalten (ohne viele böse Umwandlungen).
my_cont data;
for(my_cont::const_iterator loop = data.begin(); loop != data.end(); ++loop)
{
/* STUFF */
}
Hinweis oben: Die oben genannten Aufrufe werden tatsächlich die nicht kostenpflichtigen Versionen begin() und end() aufrufen. Aber sie werden einem const_iterator zugewiesen. Also müssen Ihre Iteratoren in const_iterator konvertiert werden, damit der obige Code funktioniert (Hinweis: Es gibt keine implizite Konvertierung von const_iterator in iterator. Das sollte eine explizite const_cast annehmen, da sie von Natur aus gefährlich ist).
class my_cont
{
public:
class iterator { /* STUFF */ }
class const_iterator
{
public: const_iterator(iterator const& rhs);
/* STUFF */
}
iterator begin();
iterator end();
const_iterator begin() const;
const_iterator end() const;
/* STUFF*/
};
Haben Sie eine 'const'-Version von' begin() ', die einen Iterator zurückgibt, der mit' const' container arbeitet? –