【发布时间】:2012-01-28 13:36:24
【问题描述】:
嗯,我目前正在重构我很久以前制作的一个类。该类是一个容器类型。
许多函数可以利用类结构的优势,因此被实现为成员函数。但是现在似乎有很多功能看起来“相同”,即“查找”功能:
iterator find(ITEM)
const_iterator find(ITEM) const;
iterator find_if(ITEM, PRED)
const_iterator find_if(ITEM, PRED) const;
4 个“函数”来描述几乎相同(并且每个版本中的代码几乎相同)。这在更新课程时变得非常繁琐,我必须确保每个版本都升级。有没有办法更好地处理这些事情? CAN 类中的一些其他函数可能需要 2 个谓词,这意味着我突然要管理 8 个函数。
我尝试从常量版本中调用“非常量版本”,但这显然不起作用。
那么如何处理这些事情呢?硬着头皮写下来?
编辑:只是为了通知:我的数据结构类似于“树”。每个“对象”都包含数据(find 搜索的)和一个带有子树的“列表”。 find 函数在树的所有子树(和子子树)上递归工作。 - 就像人们在搜索一棵树时所期望的那样。
由于这种树没有明确的“结束”或“开始”迭代器,因此使用 std::find 不会产生正确的功能。
【问题讨论】:
-
@FredOverflow:好点子。迭代器和算法的存在正是为了解决 OP 想要自己再次滚动的问题。
-
@FredOverflow,Kerrek:不完全是。是的,
std::find存在,但std::map::find、std::set::find等也存在。 -
@OliCharlesworth:但没有
map::find_if:-) 是的,在适当的时候提供一个成员函数,但如果它只做与通用算法相同的事情,则不是。 -
@KerrekSB(和任何人)-我对为什么使用成员方法查找做了一些说明。 (也许我应该重命名它,尽管从课外看它很有意义)。
-
我明白为什么 member-find 很有用(你实际上是在重新发明
std::set)。我不明白您为什么需要自定义find_if,我也不明白为什么您不能提供带有 begin 和 end 的普通迭代器接口。
标签: c++ iterator constants containers code-duplication