ich die folgende Klasse haben:Trans einen Iterator auf einem unordered_map mit Zeigerwert Typ Iterator auf der gleichen Karte mit konst Referenzwert Typ
#include <unordered_map>
#include <memory>
class Node {
public:
typedef std::unique_ptr<Node> ptr_type;
typedef std::unordered_map<char, ptr_type> map_type;
typedef /**???**/ const_iterator;
const_iterator begin() const;
const_iterator end() const;
private:
map_type _children;
};
Wie Sie sehen können, ich fo ein Benutzer eine Art und Weise wollen dieser Klasse, um über Elemente von _children
zu iterieren, ohne sie modifizieren zu können. Deshalb möchte ich einen Iterator erstellen, der auf Elemente vom Typ pair<char, const Node&>
anstelle von pair<char, ptr_type>
zeigt.
Das Erstellen einer Basis-Iterator-Klasse scheint für die vorliegende Aufgabe etwas zu kompliziert zu sein. Ich habe einen Blick auf Boost-Iterator geworfen, ich denke, transform_iterator
ist vielleicht der Weg zu gehen, aber ich habe noch nicht gefunden, wie es funktioniert.
Während ich dabei bin, weiß jemand, wo ich Beispiele für die verschiedenen Beispiele von Iteratoren in boost-iterators
definiert finden kann? Es gibt nur ein Beispiel im Dokument für jeden Typ, und sie passen nicht immer zu meinen Bedürfnissen (ich bin neu in dieser Bibliothek, ich habe vielleicht etwas Offensichtliches übersehen).
UPDATE: Hier ist mein Versuch boost::transform_iterator
class Node {
public:
typedef std::unique_ptr<Node> ptr_type;
typedef std::unordered_map<char, ptr_type> map_type;
struct Transformer {
std::pair<char, const Node&> operator()(const std::pair<char, ptr_type> &p) const {
return std::pair<char, const Node&>(p.first, *p.second);
}
};
typedef boost::transform_iterator<Transformer, map_type::const_iterator, std::pair<char, const Node&>&, std::pair<char, const Node&>> const_iterator;
const_iterator begin() const {
return boost::make_transform_iterator<Transformer, map_type::const_iterator>(_children.begin(), Transformer());
}
const_iterator end() const {
return boost::make_transform_iterator<Transformer, map_type::const_iterator>(_children.end(), Transformer());
}
private:
map_type _children;
};
bei Verwendung Es ist leider nicht kompilieren, und gibt den folgenden Fehler:
error: no type named ‘type’ in ‘boost::mpl::eval_if<boost::is_same<boost::iterators::use_default, boost::iterators::use_default>, boost::result_of<const Node::Transformer(const std::pair<const char, std::unique_ptr<Node> >&)>, boost::mpl::identity<boost::iterators::use_default> >::f_ {aka struct boost::result_of<const Node::Transformer(const std::pair<const char, std::unique_ptr<Node> >&)>}’
typedef typename f_::type type;
['boost :: transform_iterator'] (http://www.boost.org/doc/libs/1_53_0/libs/iterator/doc/transform_iterator.html) sollte dazu in der Lage sein. Oder Sie können einen eigenen benutzerdefinierten Iterator-Wrapper in diese Zeilen schreiben. –