C++ 等价于 Java 的链表/C# 的数组列表?

Posted

技术标签:

【中文标题】C++ 等价于 Java 的链表/C# 的数组列表?【英文标题】:C++ equivalent of Java's Linked List / C#'s Array List? 【发布时间】:2011-10-03 10:33:42 【问题描述】:

是否有 STL 容器或其他东西提供与 Java 的链接列表或 C# 的数组列表相同的功能?即将不同的类型附加到同一个数组中,如

List.Append(1);
List.Append("I am a string");
List.Append(True);

和动态函数,如

List.Resize();
List.GetSize();

等等?

如果没有,您可以使用模板等自己实现吗?如果有,怎么做?

【问题讨论】:

【参考方案1】:

首先,C# 中的 ArrayList 和 Java 中的 LinkedList 是根本不同的野兽(一个实现可调整大小的数组,而另一个实现链表)。

其次,不推荐使用 C# 中的 ArrayList(但不是 Java);请改用通用的List<T>(在您的情况下为List<object>)。

第三,这对应于 C++ 中的std::vector

如果你需要在其中插入不同的类型,你有三个基本的选择:

使用Boost.Any 使用Boost.Variant 使用通用基类。在 95% 的情况下,这是最明智的选择。

【讨论】:

"使用通用基类。"请查看我对 littleadv 答案的评论。 @burningprodigy 那么问题出在哪里呢?如果您有一个公共基类Sprite,那么只需使用精灵指针向量。您遇到的问题(无法调用子类方法)与您在 C# 和 Java 中遇到的相同,并且表明您的架构存在缺陷。【参考方案2】:

使用模板很难实现这一点,因为模板为成员假定单一类型。在 C++ 中,您必须使用具有公共源的多态性(在 Java 和 C# 中可用作所有类的公共“对象”父级,恕我直言)。

您可以尝试使用 boost 库和 boost::variantboost::any (choose which one fits your needs) 来实现。

【讨论】:

或某种变体类 好吧,假设我有一组对象都继承自同一个基类。如果我使用运行时多态性,我将能够使用基类指针将所有内容添加到单个数组中。但是他们不是只能执行基类中定义的方法而不能执行他们自己的方法吗? @burningprodigy - 是的,如果您使用运行时多态性,那将是您的限制。您可以使用dynamic_cast 切换类型,但它有点难看。潜在需求是什么? @littleadv 一个 rpg 磁贴引擎。 tiles[i].image = spriteset[i].image 所有的精灵都继承自 sprite 基类。但我无法将它们打包到 spriteset[] 数组中 @burningprodigy:哦,天哪,为什么你需要瓦片来拥有不同的类?他们有如此截然不同的行为吗?【参考方案3】:

您可以将 std::list 与 boost.Variant 组合为类型 T。

【讨论】:

【参考方案4】:

您可以使用boost::any,然后使用 std::list。 看一下boost首页的examples。

【讨论】:

【参考方案5】:

Java/C# 通过拥有一个所有类派生自的 Object 类来管理这一点。 C++ 没有这个根。

如果您的所有数据都在类层次结构中,那么您可以使用 std::list 或指针向量(裸或智能)指向根类。

如果不是,那么您需要使用适配器使它们显示为相同的类,例如boost::variant 然后列出这些。例如std::list<boost::variant>

【讨论】:

以上是关于C++ 等价于 Java 的链表/C# 的数组列表?的主要内容,如果未能解决你的问题,请参考以下文章

从 O(1) 中的链表中删除任何元素 - Java vs C++

剑指Offer-16.合并两个排序的链表(C++/Java)

使用向量类实现堆栈的链表与动态数组

C++ - 使用 std::list,如何打印对象私有成员的链表?

使用类的 c++ 方法的链表

在搜索现有成员的链表时返回布尔结果 - java