在这种情况下,使用向量或集合(stl容器)与普通数组相比是有利的吗?
答案 0 :(得分:3)
“正常数组”是静态对象:它们的大小是固定的,并在编译时确定。 动态容器可以包含任意数量的元素,这些元素可以在运行时更改。
必然,动态容器必须使用比静态数组更昂贵的内存分配操作。如果你需要一个动态容器,就无法绕过它,但是如果一个静态数组就足够了,你可能更愿意(但是使用std::array
!)。
另请注意,具有自动存储功能的静态数组通常不能太大,因为程序通常只有自动对象的内存有限。
另一点是实用程序:链接列表和二叉搜索树等几种高级数据结构仅在标准库中作为动态容器提供。如果您需要列表或队列或地图,即使它只是很小且有限大小,动态容器也很容易获得,而标准库中没有静态模拟。 (但是,由于标准容器使用的 allocators ,您始终可以使用池类型分配器将动态容器置于静态数组中.C ++将对象生存期与记忆寿命。)
答案 1 :(得分:1)
我建议几乎没有理由使用std :: vector。 std :: deque具有所有优点(持续时间访问等),没有任何缺点(可怕的调整大小性能)。 仅时间你可以选择一个矢量而不是双端队列,如果你需要它是由一个真实的,老式的,C风格的数组支持的事实。唯一的原因是你需要将它传递给一些遗留函数(作为一个数组)。
矢量优于传统阵列的优势是有限的。如果你插入它的当前大小,它会增长,但效率极低(请参阅std :: deque以获得更好的选项)。索引越过矢量的末尾就像它是一个数组一样容易,所以没有任何好处。内存管理质量只能分配/取消分配它包含的项目。但这些通常是指针,所以这没有帮助。如果它们是实例(不是指针),那么数组也将正确分配/解除分配它们。
如果我需要一个数组,我可能会选择vector,因为它有一些很好的API,如size
,begin
和& end
。但总的来说,我的建议是不要使用任何一个!和std :: deque INSTEAD一起去吧!
答案 2 :(得分:0)
一个优点是STL容器可以为您处理内存管理,并且与C样式数组相比,不太可能导致缓冲区溢出或内存泄漏。它们也是预制的,所以你不必花时间重新发明轮子。因此,只要你担心这些事情,STL容器就是更好的选择。
答案 3 :(得分:0)
有何优势? set, multiset, vector, list, map, deque, stack, queue, priority_queue, multimap, bitset
的实施方式各不相同。这取决于你在做什么。有些是使用平衡树实现的,有些是连续数组,有些是链表等。有些插入速度更快,有些访问速度更快,有些插入更快,等等。
没有容器总是对另一个容器有利,否则另一个容器将不存在。软件开发的一部分是能够做出诸如“我应该使用哪个容器”这样的决定,那么你真正的问题是什么,以及你如何才能使你的容器变得有利?
显然,数组总是比向量快,因为向量的底层组件是一个数组,因此向量只会有开销。但是这种开销为你做了很多很棒的事情,这意味着你不必担心数组你需要担心的事情。
答案 4 :(得分:0)
大多数情况下,标准容器比旧式阵列更受欢迎。他们只有更多的能力。数组在std :: vector上合理的唯一一次是在编译时知道大小并且相当小(即不是兆字节)并且你需要节省堆分配的开销。有时,数组会更方便,因为您可以将arr
而不是&vec[0]
传递给函数,但这是一个非常小的代价。
如果您在std :: vector和std :: set以及其他标准容器之间选择时遇到问题,请参阅此处:In which scenario do I use a particular STL container?