自定义迭代器

时间:2013-03-07 14:47:55

标签: c++ iterator

我正在使用数据结构创建一个库:std::vector<std::string>。我必须满足API,它说为了迭代我的数据结构,用户必须执行以下操作:

for (lib::result::const_iterator it = data.begin(); it != data.end(); it++)

我有两种方法可以做到这一点,我自己实现lib::result::const_iterator或从std::vector<std::string>::iterator继承,它们都应该有效。我已经读过继承vector vector迭代器是一个坏主意。

我决定使用Boost迭代器外观,这是一个好主意吗? 另外,我在实施increment()时遇到了问题。如果我有一个指向std :: vector中字符串的指针,我该如何指向下一个字符串?

最后,我的实现可能会从std::vector<std::string>更改为std::vector<MyDatatype>,因此我想使用boost facade,因此如果我决定更改数据结构,事情会更容易。 感谢。

2 个答案:

答案 0 :(得分:2)

你可以使用向量迭代器:

class MyClass
{
     typedef std::vector<std::string>  MyData;

     MyData    data;

     public:
         typedef  MyData::iterator       iterator;
         typedef  MyData::const_iterator const_iterator;

         iterator       begin()       {return data.begin();}
         const_iterator begin() const {return data.begin();}

         .... etc

答案 1 :(得分:1)

namespace lib {
  struct class {
    typedef std::vector<std::string>::const_iterator const_iterator;
    const_iterator begin() const;
    const_iterator end() const;
  };
};

如果更改基础类型,假设迭代器与std::vector<std::string>迭代器兼容,则只需更改typedef。如果它与std::vector<std::string>迭代器不兼容,则表示您正在破坏API。然而,这真的是另一天的问题。

如果确实需要实现迭代器,boost的“迭代器适配器”是一个不错的选择:用你的std::vector<std::string>迭代器包装。

如果我必须在库版本更改上生成稳定的二进制接口,那么“iterator fascade”将是我可能会使用的东西。在这种情况下,我的“迭代器外观”将转发到pImpl - 类型virtual接口(重复“迭代器外观”从其实现中需要的方法),该接口实现了外观的每个功能。然后,内部pImpl实现将以类似于“迭代器适配器”的工作方式将方法转发到std::vector<std::string>。但几乎在所有情况下,这都是过度的。

但是第一种情况 - 你输入std::vector<std::string>::const_iterator - 是最有效和最容易实现的。