我有一个纯抽象类和两个派生类,我用它来存储相同类型的数据,比方说int
,但在不同的数据结构中,我们假设map
和{{{ 1}}。
vector
在class AbstractContainer {
public:
virtual MyIterator firstValue() = 0;
}
class ContainerMap : public AbstractContainer {
private:
map<K, int>;
public:
MyIterator firstValue() { // return iterator over map values (int) }
}
class ContainerVector : public AbstractContainer {
private:
vector<int>;
public:
MyIterator firstValue() { // return iterator over vector values (int) }
}
我可以继承ContainerMap
来迭代地图值。
但是如何定义一个通用迭代器map<K, int>::iterator
,独立于数据结构,以这种方式给定一个类型为MyIterator
的指针我可以迭代值忽略存储的实际结构数据?除此之外,这是一个很好的做法吗?
修改
这个问题是问题的简化。在我的项目中,其中一个子类将我的对象存储在内存中(在AbstractContainer
中),而另一个子类从外部数据库中检索对象。我正在尝试创建一个公共接口来访问对象集合,这与数据源无关,因为操作(搜索,插入和删除)将完全相同。
答案 0 :(得分:1)
嗯,不,这不是好习惯。
有多个容器类型(例如,在STL中)的原因是没有针对所有内容进行优化的单个容器。因此,一个容器类型可能更适合于将元素插入容器一次并且多次迭代的用例,而另一个容器可能更适合需要重复添加和删除中间元素的代码。
每个STL容器指定自己的迭代器的原因是迭代每个容器以不同的方式工作。适合使用向量的迭代器最多只能在列表中效率低下 - 最坏的情况 - 无法正常工作。
也就是说,就像在STL中一样,没有什么能阻止两个不同的容器使用相同的名称作为它们的迭代器。因此Container_X
和Container_y
都可以有一个名为Iterator
的迭代器,但Container_X::Iterator
不需要像Container_Y::Iterator
那样工作。
你不是第一个想要与容器无关的代码的人(虽然你已经把它作为“与迭代器无关”的措辞)。你不会是最后一个。除非一些伟大的思想设法指定一个容器类型,其中所有操作都适用于所有可能的用例(与当前的游戏状态相反,即每个容器类型对于某些用例而言是最佳的,但对于其他用例而言是差的)容器不可知代码是徒劳的目标。对于大多数措施,对于大多数(如果不是全部)不同容器类型的一个或多个操作,可以跨所有容器工作的迭代器可能是最低效的。
答案 1 :(得分:0)
您要做的是创建一个继承自C ++标准迭代器类的独立迭代器类。然后,您需要在迭代器类中实现所有标准迭代器函数(即dereference,++,==,!=等)。
在您的数据结构中,您希望拥有一个函数,该函数将从结构中的任何点返回后继节点/值 - 此函数将由迭代器的重载++运算符调用,以便移动到下一个节点/数据结构中的值,按您想要的顺序排列。例如,对于给定索引的向量,您希望后继方法返回向量中给定索引之后的索引。
但据我所知,您希望迭代器是通用的,以便您可以为多个数据结构使用相同的迭代器类。这可以通过在迭代器类中使用模板和检查来实现;但是,它可能不是一个非常安全的实现 - 不推荐。
继承标准库数据结构并执行您在此处尝试执行的操作是不好的做法吗?在现实世界中,它可能被认为是不好的做法,是的。但是出于实验目的或个人项目,我相信这将是一次很好的学习经历!