STL喜欢在哈希映射集合上进行迭代

时间:2014-07-21 17:41:58

标签: c++ map iterator

我正在寻找一种方法来创建一个前向迭代器,它允许迭代一组哈希映射。

保存多个地图的示例性类如下所示。 (我正在使用unordered_mapshared_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的正确方法是什么?

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

您可以使用 boost iterator facade ,这将帮助您完成实现自定义迭代器的任务。这个想法是:

1 - 保持对包含地图(levels_)的矢量的引用 2-a迭代器,指示自定义迭代器迭代的前一个向量的哪个元素(类型为std::vector<MapPtr>::iteratorstd::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提供了一种方法来定义实现其余部分所需的最小值。