我需要一个运行时大小已知且无需调整大小的容器。 std::unique_ptr<T[]>
会很有用,但没有封装的大小成员。同时std::array
仅用于编译类型大小。因此,我需要这些类的一些组合,并且没有/最小开销。
是否有满足我需求的标准类,也许是即将推出的 C++20 中的一些内容?
最佳答案
使用std::vector
。这是 STL 中运行时大小数组的类。
它可以让您调整它的大小或将元素插入其中:
auto vec = std::vector<int>{};
vec.resize(10); // now vector has 10 ints 0 initialized
vec.push_back(1); // now 11 ints
评论中指出的一些问题:
vector has an excessive interface
std::array
也是如此. std::array
中有 20 多个函数,包括运算符。
只是不要使用你不需要的东西。您无需为不会使用的功能付费。它甚至不会增加您的二进制大小。
vector will force initialize items on resize. As far as I know, it is not allowed to use
operator[]
for indexes >= size (despite callingreserve
).
这不是它的用途。保留时,您应该使用 resize
或将元素插入其中来调整 vector 的大小。你说 vector 会强制将元素初始化到其中,但问题是你不能在未构造的对象上调用 operator=
,包括 int。
这是一个使用保留的例子:
auto vec = std::vector<int>{};
vec.reserve(10); // capacity of at least 10
vec.resize(3); // Contains 3 zero initialized ints.
// If you don't want to `force` initialize elements
// you should push or emplace element into it:
vec.emplace_back(1); // no reallocation for the three operations.
vec.emplace_back(2); // no default initialize either.
vec.emplace_back(3); // ints constructed with arguments in emplace_back
请记住,这种分配和用例的可能性很高,编译器可能会完全忽略 vector 中元素的构造。您的代码中可能没有开销。
如果您的代码符合非常精确的性能规范,我建议您进行测量和剖析。如果您没有这样的规范,这很可能是过早的优化。内存分配的成本完全衡量的是逐一初始化元素所花费的时间。
您的程序的其他部分可能会被重构以获得比琐碎的初始化所能提供的性能更高的性能。事实上,妨碍它可能会阻碍优化并使您的程序变慢。
关于c++ - 是否有用于具有固定运行时确定大小的数组的标准 C++ 类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55376433/