向量和映射C ++的通用迭代器

时间:2015-10-19 11:42:14

标签: c++ c++11 iterator

我有一个"将军"容器,具有底层地图或矢量。例如:

class Container
{
  typedef variant<vector<string>, map<string, string>> Data;

public:
  iterator begin();
  iterator end();

private:
  Data mData;
};

我希望为用户提供一个通用的迭代器。很容易取消引用这样的迭代器,因为它总是可以返回一对值。

struct pair
{
  string key;
  string value;
}

如果是数组,键值将是索引。

但我不确定如何正确处理迭代器。目前我正试图做这样的事情:

class iterator
{
  public:
    iterator(vector<string>::iterator it);
    iterator(map<string, string>::iterator it);
    ..

  private:
    bool m_isMap;
    vector<string>::iterator it;
    map<string, string>::iterator it;
};

但是这个实现有点乱。有没有更好的方法?或者甚至是一个准备好的提升解决方案?

1 个答案:

答案 0 :(得分:2)

  1. 然而,通常要做的是创建使迭代器成为模板函数的函数,并为所需的各种迭代器实例化它。

  2. 您可以使用提升any_iterator

  3. 您可以使用Boost属性映射,这正是为了使用密钥创建/获取属性的一致接口。

    • 使用make_iterator_property_map作为向量(索引是键)
    • 使用make_associative_property_map作为地图(使用地图的密钥)

    当然,这仍然需要代码将propertymap作为泛型参数(因为类型不同)。但是,您可以使用dynamic_property_map

    对其进行分摊
  4. 滚动自己的类型擦除。你可以使用Boost Type Erasure作为构建块(它摇滚)。但是,当然,你可以在没有提升的情况下做到这一点。这可能是一个好处