gpt4 book ai didi

c++ - C++中多个容器的自定义迭代器

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:17:46 24 4
gpt4 key购买 nike

我有一个纯抽象类和两个派生类,用于存储相同类型的数据,比方说 int ,但在不同的数据结构中,假设一个 map和一个 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我可以迭代忽略存储数据的实际结构的值吗?除此之外,这是一个好习惯吗?

编辑

这道题是问题的简化。在我的项目中,其中一个子类将我的对象存储在内存中(在 std::map 中),而另一个子类从外部数据库中检索对象。我正在尝试创建一个通用接口(interface)来访问对象集合,它独立于数据源,因为操作(搜索、插入和删除)完全相同。

最佳答案

嗯,不,这不是好的做法。

存在不止一种容器类型(例如,在 STL 中)的原因是没有针对所有内容进行优化的单一容器。因此,一种容器类型可能更适合将元素插入容器一次并迭代多次的用例,而另一种容器可能更适合需要在中间重复添加和删除元素的代码。

每个 STL 容器指定其自己的迭代器的原因是迭代每个容器以不同的方式工作。适合使用 vector 的迭代器充其量在列表上效率低下,最坏的情况是无法正常工作。

就是说,就像在 STL 中一样,没有什么可以阻止两个不同的容器对它们的迭代器使用相同的名称。所以 Container_XContainer_y 都可以有一个名为 Iterator 的迭代器,但是 Container_X::Iterator 不需要工作与 Container_Y::Iterator 相同。

您不是第一个想要代码与容器无关的人(尽管您有效地将其表述为“与迭代器无关”)。而且你不会是最后一个。除非一些伟大的头脑设法指定一个容器类型,其中所有操作都对所有可能的用例都是最佳的(与当前的游戏状态形成对比,即每个容器类型对某些用例都是最佳的,但对其他用例来说很差)容器不可知代码是一个徒劳的目标。一个可以跨所有容器工作的迭代器可能会非常低效,对于许多度量,对于大多数(如果不是全部)不同容器类型的一个或多个操作。

关于c++ - C++中多个容器的自定义迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30959327/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com