C++ 我应该使用std::vector而不是数组吗
在我看来,除了std::vector似乎更灵活之外,它们都有相同的函数,所以什么时候我需要使用数组,我可以只使用std::vector吗?C++ 我应该使用std::vector而不是数组吗,c++,arrays,stdvector,C++,Arrays,Stdvector,在我看来,除了std::vector似乎更灵活之外,它们都有相同的函数,所以什么时候我需要使用数组,我可以只使用std::vector吗? 这不是一个新问题,最初的问题没有我在使用std:vector时想要的答案,唯一的性能影响是当达到容量时,因为必须重新定位内存以容纳堆上相邻内存空间中更多的对象 因此,以下是关于灵活性和性能的总结: std::数组;不可能进行重新分配,因此不会由于堆上内存的重新定位而导致性能下降 std::vector;只有在超出容量并发生重新分配时,才会影响性能。您可以使用
这不是一个新问题,最初的问题没有我在使用std:vector时想要的答案,唯一的性能影响是当达到容量时,因为必须重新定位内存以容纳堆上相邻内存空间中更多的对象 因此,以下是关于灵活性和性能的总结: std::数组;不可能进行重新分配,因此不会由于堆上内存的重新定位而导致性能下降
std::vector;只有在超出容量并发生重新分配时,才会影响性能。您可以使用reserve(size)粗略估计所需对象的最大数量。与std::array相比,这允许更大的灵活性,但如果超出保留空间,当然必须重新分配内存。使用std:vector时,唯一的性能影响将是达到容量时,因为必须重新定位内存以容纳堆上相邻内存空间中更多的对象 因此,以下是关于灵活性和性能的总结: std::数组;不可能进行重新分配,因此不会由于堆上内存的重新定位而导致性能下降
std::vector;只有在超出容量并发生重新分配时,才会影响性能。您可以使用reserve(size)粗略估计所需对象的最大数量。与std::array相比,这允许更大的灵活性,但如果超出保留空间,当然必须重新分配内存。需要注意的一件有趣的事情是,虽然迭代器在许多带有向量的函数中会失效,但数组却不是这样。注意:
std::swap
使用std::array
迭代器仍将指向同一点
请参阅更多:
很好地总结了阵列的优点:
这一点似乎最有趣:
固定大小的数组可以直接嵌入到结构或对象中,
它可以改善内存局部性并减少堆的数量
所需拨款
没有测试过,我不确定这是真的
以下是关于2D矢量与阵列的讨论,涉及Code Chef中的竞争编程:
显然,在二维向量中,内存在二维空间中不是连续的,只有一维空间,但在二维数组中却是连续的。需要注意的一件有趣的事情是,虽然迭代器在许多向量函数中会失效,但数组却不是这样。注意:
std::swap
使用std::array
迭代器仍将指向同一点
请参阅更多:
很好地总结了阵列的优点:
这一点似乎最有趣:
固定大小的数组可以直接嵌入到结构或对象中,
它可以改善内存局部性并减少堆的数量
所需拨款
没有测试过,我不确定这是真的
以下是关于2D矢量与阵列的讨论,涉及Code Chef中的竞争编程:
显然,在二维向量中,内存在二维空间中不是连续的,只有一维空间,但在二维数组中却是连续的。根据经验,您应该使用:
- 一个std::数组,如果中的大小在编译时是固定的
- 一个std::vector是指编译时大小不固定
- 他们的第一个元素的地址上的指针是您需要低级别访问
- 如果要实现(非标准)容器,则为原始数组
标准容器有能力知道它们的大小,即使当你传递到其他函数,原始数组不存在,并且没有足够的好处,在没有特定的原因的情况下,C++代码中永远不会使用原始数组。一个可能是需要低级别优化的瓶颈,但只有在分析以确定瓶颈之后。您应该在实际情况下对标准容器是否实际添加了任何重载进行基准测试
我能想到的唯一好的理由是如果你实现了一个特殊的容器。由于标准容器并不意味着要派生,所以您只有两种选择,要么让类包含一个标准容器,并在包含到处都有委托的容器的容器中结束,要么模仿一个标准容器(通过从一个众所周知的实现复制代码),并对其进行专门化。在这种情况下,您将发现自己直接管理原始阵列。根据经验,您应该使用:
- 一个std::数组,如果中的大小在编译时是固定的
- 一个std::vector是指编译时大小不固定
- 他们的第一个元素的地址上的指针是您需要低级别访问
- 如果要实现(非标准)容器,则为原始数组
标准容器有能力知道它们的大小,即使当你传递到其他函数,原始数组不存在,并且没有足够的好处,在没有特定的原因的情况下,C++代码中永远不会使用原始数组。一个可能是需要低级别优化的瓶颈,但只有在分析以确定瓶颈之后。您应该在实际情况下对标准容器是否实际添加了任何重载进行基准测试
我能想到的唯一好的理由是如果你实现了一个特殊的容器。由于标准容器并不意味着要派生,所以您只有两种选择,要么让类包含一个标准容器,并在包含到处都有委托的容器的容器中结束,要么模仿一个标准容器(通过从一个众所周知的实现复制代码),并对其进行专门化。在这种情况下,您将发现自己直接管理原始阵列。如果您需要“动态”阵列,那么这是自然的解决方案。我应该