c++ - 是否有用于具有固定运行时确定大小的数组的标准 C++ 类?

标签 c++ arrays c++20

我需要一个运行时大小已知且无需调整大小的容器。 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 calling reserve).

这不是它的用途。保留时,您应该使用 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/

相关文章:

c++ - ‘binary_semaphore’ 尚未在 ‘std’ 中声明

c++ - 为什么在 boost python vector 索引套件中需要比较运算符?

c++ - 当我们使用 CTRL + Break 中断时如何在 WinDbg 中查看真实的调用堆栈

c - 如何打印二维字符数组的内容?

javascript - 遍历JavaScript中的数组

c++ - 如何在 C++ 中从 std::chrono::year_month_day 获取工作日数

c++ - 如何只允许变量中的数字?

c++ - 局部变量的安全

c - 读取文件并在每行的开头添加 10 个数组元素读取到数组我正在存储文件的行

c++ - 为什么const成员函数模板是为非const对象实例化的?