Я структура пользовательских данных, как следующее:Пользовательский итератор с помощью наддува итератора
class Node;
class GraphDM {
public:
GraphDM();
// these are to iterate on all items of _faninNodes
// like all elements in multimap
FaninIter faninBegin();
FaninIter faninEnd();
// these are to iterate on all items of _fanoutNodes
FanoutIter fanoutBegin();
FanoutIter fanoutEnd();
// these should work like equal_range of multimap
std::pair<FaninIter, FaninIter > getFanins (const Node *node_);
std::pair<FaninIter, FaninIter > getFanouts(const Node *node_);
private:
typedef std::vector< Node* > NodeList;
typedef boost::unordered_map< Node*,
NodeList > Map;
Map _faninNodes;
Map _fanoutNodes;
};
Мне нужно реализовать этот API. Как я могу реализовать их с помощью библиотеки итераторов boost?
Кроме того, я, возможно, потребуется принять предиката, чтобы фильтровать
Некоторые указатель, чтобы начать работу, будет очень полезно. Одно уточнение: я не могу использовать флагов компилятора C++ 0x, поскольку мне нужно использовать только C++ 98. Поэтому, пожалуйста, предложите решение, для которого не требуется флаг компилятора C++ 11 или C++ 03.
Кроме того, если я проектирую итератор, как следующий (вложенный в класс GraphDM), я по существу раскрываю детали своей структуры данных. Есть ли способ сделать итератор итерацией только на Ключи карты (а не на значение)? Затем я могу вернуть другой тип итератора для getFanins() и getFanout(), который будет итератором из списка значений.
class Iter : public boost::iterator_adaptor< Iter,
Map::iterator,
boost::use_default >
{
public:
Iter() : Iter::iterator_adaptor_() {}
private:
friend class GraphDM;
Iter(Map::iterator it)
: Iter::iterator_adaptor_(it) {}
friend class boost::iterator_core_access;
};
Одно уточнение: я не могу использовать C++ 0x. Поэтому, пожалуйста, предложите решение, для которого не требуется флаг компилятора C++ 11 или C++ 03. – soumeng78
Это то, что я получаю: вы даже не знаете, какой уровень компилятора вы используете, и вы хотите, чтобы мы выполнили вашу работу за вас. (Конечно, вы ** можете использовать ** C++ 03.). Также отредактируйте свой вопрос. Теги для тегов. Комментарии не предназначены для редактирования. – sehe
«Возможно, мне нужно будет взять Предикат, чтобы разрешить фильтрацию» - я проигнорировал это, поскольку он не является частью вопроса, и неясно, что это значит (я могу придумать несколько разных вещей, которые это может означать). – sehe