我有一個自定義的數據結構,就像下面:使用自定義迭代器升壓迭代
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