c++等价于Java's链表/ c# 's数组列表

本文关键字:数组 列表 链表 c++ 等价于 Java | 更新日期: 2023-09-27 18:01:45

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

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

和动态函数如

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

等。

如果没有,你可以使用模板等自己实现一个吗?如果有,是怎么做到的?

c++等价于Java's链表/ c# 's数组列表

使用模板很难实现这一点,因为模板为成员假定了单一类型。在c++中,你必须使用一个公共源的多态性(这在Java和c#中作为所有类的公共"对象"父类可用,IMHO)。

您可以尝试使用boost库和boost::variantboost::any(选择适合您需要的一个)来完成此操作。

首先,c#中的ArrayList和Java中的LinkedList在本质上是不同的(一个实现了一个可调整大小的数组,而另一个实现了一个链表)。

其次,c#中的ArrayList(而不是Java)是不赞成的;使用通用的List<T>代替(在您的情况下,List<object>)。

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

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

  • 使用增加。任何
  • 使用增加。变异
  • 使用公共基类。在95%的情况下,这是最明智的选择。

您可以先使用boost::any,然后再使用std::list。
看一下boost主页的示例。

可以将std::list与boost结合使用。t型的变体

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

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

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