我正在使用数据结构创建一个库: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,因此如果我决定更改数据结构,事情会更容易。
感谢。
答案 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>
迭代器包装。
pImpl
- 类型virtual
接口(重复“迭代器外观”从其实现中需要的方法),该接口实现了外观的每个功能。然后,内部pImpl
实现将以类似于“迭代器适配器”的工作方式将方法转发到std::vector<std::string>
。但几乎在所有情况下,这都是过度的。
但是第一种情况 - 你输入std::vector<std::string>::const_iterator
- 是最有效和最容易实现的。