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和c#中作为所有类的公共"对象"父类可用,IMHO)。
您可以尝试使用boost库和boost::variant
或boost::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>