我正在寻找一种方法来创建一个前向迭代器,它允许迭代一组哈希映射。
保存多个地图的示例性类如下所示。 (我正在使用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;
}
显然,可以通过不同级别和每个级别对它的地图进行迭代,但我想为用户隐藏不同级别的创建。
为班级(const_)iterator
定义MapCollection
的正确方法是什么?
感谢您的帮助!
答案 0 :(得分:0)
您可以使用 boost iterator facade ,这将帮助您完成实现自定义迭代器的任务。这个想法是:
1 - 保持对包含地图(levels_
)的矢量的引用
2-a迭代器,指示自定义迭代器迭代的前一个向量的哪个元素(类型为std::vector<MapPtr>::iterator
或std::vector<MapPtr>::const_iterator
)或具有相同信息的索引(以检索level_[index]
的结尾) 。
3-a迭代器,具有前一个迭代器迭代的当前元素(迭代的实际元素)。
一些示例代码:
#include <boost/iterator/iterator_facade.hpp>
namespace impl
{
template <class Value>
class iterator
: public boost::iterator_facade<
config_iterator<Value>
, Value
, boost::forward_traversal_tag
>
{
public:
config_iterator() {...}
explicit config_iterator(parameters) { /*your specific contructor*/ }
private:
template <class OtherValue>
config_iterator(config_iterator<OtherValue> const& other);
friend class boost::iterator_core_access;
template <class> friend class config_iterator;
template <class OtherValue>
bool equal(config_iterator<OtherValue> const& other) const { } // Verify is two iterators are equals (used to verify if it == end)
void increment() {} // Logic for incrementing the iterator
Value& dereference() const {} // Returning the actual value
// members
};
}
typedef impl::iterator<type> iterator;
这是非常简单的迭代器(转发)的模板文件,请阅读Iterator Help以获取更多信息,同样可以实现重载正确的运算符(++ post pre pre increment,*, - &gt;,等......),通过boost提供了一种方法来定义实现其余部分所需的最小值。