1

我正在使用数据结构制作一个库: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,它们都应该工作。我读过从向量迭代器继承是一个坏主意。

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

最后,我的实现可能会从std::vector<std::string>, 变为std::vector<MyDatatype>,所以我想使用 boost 外观,所以如果我决定对我的数据结构进行更改,事情会更容易。谢谢。

4

2 回答 2

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
于 2013-03-07T15:09:15.257 回答
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>用你的迭代器包装。

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

但是第一种情况——你 typedef的地方std::vector<std::string>::const_iterator——是最有效和最容易实现的。

于 2013-03-07T15:09:14.210 回答