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
-typevirtual
接口(它重复“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