【发布时间】:2012-12-30 08:13:04
【问题描述】:
假设我有一个类似容器的抽象类,名为RuleBook。 RuleBook 的用户希望能够向前迭代 RuleBook 以获得 Rules。
与标准容器不同,这里的具体子类的内存布局没有限制。相反,由子类的实现者来遵守RuleBook 的前向迭代要求,并根据自己的数据结构满足这一要求。
我认为RuleBook 应该包含纯虚拟begin() 和end(),这样它就可以与基于范围的for 一起使用,但我遇到了一些问题。
begin() 和 end() 的签名应该是什么? BasketballRules 和 CompanyRules 应该如何执行?
当迭代器经过最后一项时,我们如何处理结束条件?
在下面的示例中,您可以假设m_rp 和m_rpp 各只指向一个规则。我们想为胆量返回某种迭代器(如Rule*)。我们还可以假设 Foo 的所有子类都将在各种数据结构中包含Rule,这取决于实现者的心血来潮。
如果我使用Rule* 作为我的迭代器并使用null_ptr 作为我的超越端点来实现整个事情,这是否符合STL?
我目前正在研究自定义迭代器,但我什至不确定这个问题是否适合该范式,因为每个子类都必须有效地定义迭代的内容。
代码
struct RuleBook
{
// virtual Rule* begin() = 0;
// virtual Rule* end() = 0;
};
struct CompanyRules :
public RuleBook
{
Rule m_r;
};
struct BasketballRules :
public RuleBook
{
// return the three Rules, one-at-a-time, in succession
Rule m_r;
Rule* m_rp;
Rule** m_rpp;
};
int
main( int argv, char* argc[] )
{
}
【问题讨论】:
-
@MatsPetersson 如果您不想回答,请不要冷嘲热讽或居高临下 - 我上一次正式上学是很久以前的事了
-
@MatsPetersson 好吧,我可以为我的问题编写一个基于指针的解决方案,但这无济于事(我今年 42 岁——我上一次上学大约是 2 年前) - 这会混淆问题。我的问题是,我不明白遵守 STL 迭代器的复杂性。如果我改写我的问题,也许你会更高兴?也许我误解了——所以不是问问题来学习一些东西吗?
-
@MatsPetersson 我为我的抽象道歉 - 我已经改写了 OP
-
@kfmfe04:现在看起来好多了。现在如果所有成员都是
Rule,那为什么要声明三个不同的成员呢?为什么不只是一个,最好是std::vector<Rule>? -
我不确定您是否真的在寻找一般用法,或者允许
iterator的完全任意定义将这个带回家。在 C++11 中,有一组 巨大的 实用程序可用于在<iterator_traits>和<iterator>中进行利用,您可能会发现它们在您的任务中很有价值。当我必须编写一个模板类来接受任意template< class Iterator >解决一个不那么微不足道的问题时,它们肯定在我的身边。调查他们。