c++ - std::array 和 std::vector 有什么区别?你什么时候使用一个而不是另一个?

标签 c++ arrays vector

std::arraystd::vector 有什么区别?你什么时候使用一个而不是另一个?

我一直将std:vector作为一种C++使用C数组的方式来使用和考虑,那么有什么区别呢?

最佳答案

std::array只是经典 C 数组的类版本。这意味着它的大小在编译时是固定的,它将被分配为单个 block (例如,在堆栈上占用空间)。它的优点是性能稍好一些,因为对象和数组数据之间没有间接关系。

std::vector是一个包含指向堆的指针的小类。 (因此,当您分配 std::vector 时,它总是调用 new 。)它们的访问速度稍慢,因为必须追逐这些指针才能到达数组数据......但作为交换,它们可以调整大小而且无论它们有多大,它们只占用微不足道的堆栈空间。

[编辑]

至于何时使用其中一个,老实说std::vector几乎总是你想要的。在堆栈上创建大对象通常是不受欢迎的,额外的间接级别通常是无关紧要的。 (例如,如果您遍历所有元素,则额外的内存访问仅在循环开始时发生一次。)

vector 的元素保证是连续的,所以你可以通过&vec[0]任何期望指向数组的指针的函数;例如,C 库例程。 (顺便说一句,std::vector<char> buf(8192); 是一种无需直接调用 read/write 即可为调用 new 或类似方法分配本地缓冲区的好方法。)

也就是说,缺少额外的间接级别,加上编译时常量大小,可以使 std::array对于一个被创建/销毁/访问很多的非常小的数组来说,速度要快得多。

所以我的建议是:使用 std::vector除非 (a) 您的分析器告诉您有问题并且 (b) 数组很小。

关于c++ - std::array 和 std::vector 有什么区别?你什么时候使用一个而不是另一个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6632971/

相关文章:

java - 对递归方法有点陌生,我不确定为什么这不起作用

c++ - 正确地将已知数量的整数输入读入 C++ 中的 vector

c++ - 另一个 C++ vector 内存泄漏问题

c++ - "Not declared in this scope, and no declarations were found by argument-dependent lookup at the point of instantiation"

c++ - 如何通过终端命令在 mac 上编译它

c++ - LLVM 中编译单元的正确抽象是什么?

c# - 用 0 到 9 的数字填充字符串并开始新的直到长度为 50

c++ - cudaSafeCall() 运行时 API 错误

arrays - 去模板绑定(bind)常量数组值

string - 列表或向量上相同的头和尾操作