实现定义为使用保留向量而不调整其大小

Implementation defined to use a reserved vector without resizing it?

本文关键字:调整 向量 定义 保留 实现      更新时间:2023-10-16

是否定义了使用保留向量而不调整其大小的实现?

我的意思是:

#include <iostream>
#include <vector>
using namespace std;
int main()
{
    std::vector<unsigned int> foo;
    foo.reserve(1024);
    foo[0] = 10;
    std::cout<<foo[0];
    return 0;
}

在上面的例子中,我保留了大量的空间,并为该空间中的一个索引指定了一个值。然而,我没有调用push_back,它会"调整"向量的大小,并为每个元素提供一个默认值(我试图避免这种情况)。因此,在本例中,foo.size()为0,而foo.capacity()为1024。

那么,这是有效的代码还是定义了它的实现?就像我在给一个大小为"0"的向量赋值一样。它有效,但我不确定这是否是个好主意。。

我试图避免使用默认值的原因是,对于大型分配,我不需要它"清零"每个索引,因为我将决定何时写入。我会使用一个原始指针,但lodepng API只接受从文件中解码的向量。

std::vector::reserve只是保留内存,所以下一个push_back不必分配内存。它不会改变矢量的大小。

如果你想要一个1024元素的初始大小的向量,你可以使用构造函数来实现:

std::vector<unsigned int> foo(1024);

请注意,如果创建了一个初始大小为1024元素的向量,那么如果执行push_back,则添加一个元素,因此向量的大小将增加到1025元素。

无论容器中的项类型或特定编译器上发生了什么,它都是非法的。从23.1.1/12(表68)中,我们了解到operator[]的行为与*(a.begin() + n)类似。由于您没有向容器中添加任何项,这与访问未定义的end()之后的迭代器相同。