C++ 自定义迭代器

C++ 自定义迭代器,c++,iterator,C++,Iterator,我正在使用数据结构制作一个库:std::vector。我必须满足API的要求,即为了迭代我的数据结构,用户必须执行以下操作: for (lib::result::const_iterator it = data.begin(); it != data.end(); it++) 有两种方法可以做到这一点,一种是自己实现lib::result::const_iterator,另一种是从std::vector::iterator继承,它们都应该可以工作。我读过,从向量迭代器继承是个坏主意 我已经决定

我正在使用数据结构制作一个库:
std::vector
。我必须满足API的要求,即为了迭代我的数据结构,用户必须执行以下操作:

for (lib::result::const_iterator it = data.begin(); it != data.end(); it++)
有两种方法可以做到这一点,一种是自己实现
lib::result::const_iterator
,另一种是从
std::vector::iterator
继承,它们都应该可以工作。我读过,从向量迭代器继承是个坏主意

我已经决定使用Boost迭代器facade,这是个好主意吗? 此外,我在实现
increment()
时遇到问题。如果我在std::vector中有一个指向字符串的指针,那么如何指向下一个字符串

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

名称空间库{
结构类{
typedef std::vector::const_迭代器const_迭代器;
常量迭代器begin()常量;
常量迭代器end()常量;
};
};
如果更改基础类型,假设迭代器与
std::vector
迭代器兼容,只需更改typedef即可。如果它与
std::vector
迭代器不兼容,那么您正在破坏API。然而,这真的是另一天的问题

如果您确实需要实现迭代器,boost的“迭代器适配器”是一个不错的选择:将
std::vector
迭代器与您的迭代器包装在一起

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


但第一种情况——键入def
std::vector::const_迭代器——
——是最有效和最容易实现的

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
class-MyClass
{
typedef std::向量MyData;
MyData数据;
公众:
typedef MyData::迭代器迭代器;
typedef MyData::const_迭代器const_迭代器;
迭代器begin(){返回数据。begin();}
常量迭代器begin()常量{返回数据。begin();}
等

您不需要继承,只需
typedef
it“facade”。(是的,“c”发音为“s”。)
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