Java的ArrayList的C ++版本是什么


Answers:


88

使用标准库中的std::vector


2
嗯...从另一个答案来看,听起来向量不是作为链表实现的吗?我对吗?我将此列表用作一个集合,该集合中添加和删除对象的营业额相当高。这个数组实际上是最好的实现吗?还是有链表版本?
际星际

4
@interstar-绝对正确。如果您确实需要链表语义,请使用std::list,尽管那样您会失去可索引性(no operator[]),因此它实际上不是数组。list具有自己的特质,vector通常是更好的选择。在标准C ++容器中,您将不得不折衷一种方式。看一下deque,这可能为您提供更好的性能。vectorvs(dequevs )vs(vs )比较容易,list因为它们在代码中基本上可以互换-只需对容器使用typedef即可typedef vector<MyObj> MyList
史蒂夫·汤森

好吧,我先试试这个向量。因为索引很有用。如果太慢,我可能会移至链接列表。谢谢
interstar

2
ArrayList您可能会从名称中猜出来的@interstar,也未实现为链接列表。您可能会想到LinkedList。同样,即使您有相当高的对象添加和从列表中删除对象的周转率,它vector仍然可能比list只要您最初为其分配了足够的空间而无需重新分配(即,给它分配它应该需要的最大空间)。
Kyle Strand

@KyleStrand有趣。我一直认为ArrayList的意思是“实现为链表的类似数组的东西”,而不是“实现为数组的类似链表的东西”。
星际

58

这里有几个额外的要点vector

与Java不同ArrayListArray在Java中,您不需要做任何特殊的事情即可将其vector视为数组-C ++中的基础存储可保证是连续的且可高效索引。

不像ArrayList,avector可以有效地保存基本类型,而无需将其封装为完整的对象。

从中删除项目时vector,请注意,必须向下移动已删除项目上方的项目以保留连续的存储空间。对于大型容器,这可能会变得昂贵。

确保将复杂对象存储在中,以vector确保其复制构造函数和赋值运算符有效。在幕后,C ++ STL在容器内务处理过程中使用它们。

有关reserve()提前存储的建议(即在向量构造或初始化时),以最大程度地减少以后从Java扩展到C ++的扩展中的内存重新分配。


5
到目前为止,更好的答案应该是公认的答案。
保罗·鲁尼
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.