我正在尋找一種方法來創建一個前向迭代器,它允許迭代散列圖的集合。STL像迭代器在散列圖的集合
保存幾張地圖的示例類如下所示。 (我正在使用unordered_map
和shared_ptr
的提升,但C++ 11也會提供這些類)。 在我的特定應用程序中,我使用這個構造來表示稀疏的分層2D網格位置;即KeyT
是一個2D位置,ValueT
是一個整數計數器,不同的水平代表不同的網格分辨率。
template <typename KeyT, typename ValueT>
class MapCollection
{
public:
// type-definitions for the map and a shared pointer to the map
typedef boost::unordered_map<KeyT, ValueT> Map;
typedef boost::shared_ptr<Map> MapPtr;
// Constructor for class
MapCollection (int num_levels)
{
levels_.reserve (num_levels);
for (int i = 0; i < num_levels; ++i)
levels_.push_back (MapPtr (new Map()));
}
// adds a key-value pair to the map on the given level
void addValue (const KeyT &key, const ValueT &value)
{
int level = getLevelForKey (key);
(*levels_[level])[key] = value;
}
// TODO define const_iterator for this class
// TODO define member function begin(), returning levels_.front()->begin()
// TODO define member function end(), returning levels_.back()->end()
private:
// return the hierarchy level for the given key
int getLevelForKey (const KeyT &key) { return /* ... */ };
// collection of maps
std::vector<MapPtr> levels_;
};
中的應用程序現在我希望能夠遍歷所有地圖的所有條目,同樣如果僅僅過了一個地圖迭代,什麼是可能的,即
int main (int argc, char *argv[])
{
int num_levels = 5;
MapCollection maps (num_levels);
// fill maps
maps.addValue (/* ... */)
// iterator over all entries
MapCollection::const_iterator iter = maps.begin();
for (; iter != maps.end(); ++iter)
{
std::cout << "Key: " << iter->first << " | Value: " << iter->second << std::endl;
}
return EXIT_SUCCESS;
}
顯然,將有可能遍歷不同的層次和每個層次上的地圖,但我想隱藏爲用戶創建不同的層次。
定義MapCollection
類(const_)iterator
的正確方法是什麼?
感謝您的幫助!
最終使用'auto'? –
我不清楚你提出的迭代每個級別的解決方案時出現了什麼問題,然後遍歷該級別的地圖中的每個元素。你說過「我想隱藏不同層次的創建」,但我不確定這是什麼意思在迭代器的上下文中。 –
查找['boost :: join'](http://www.boost.org/doc/libs/1_55_0/libs/range/doc/html/range/reference/utilities/join.html)。 –