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

Implementation defined to use a reserved vector without resizing it?

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

我的意思是:

#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;
}

在上面,我保留了大量的 space 并且我为 space 中的其中一个索引分配了一个值。但是,我没有调用 push_back which "resizes" 向量并为每个元素赋予它默认值(我试图避免)。所以在这个 foo.size() 是 0 而 foo.capacity() 是 1024.

那么这个代码是有效的还是定义了实现?看到我分配给一个大小为“0”的向量。它有效,但我不确定这是否是个好主意..

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

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

如果你想要一个初始 size1024 元素的向量,你可以使用 constructor 来做到这一点:

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

请注意,如果您创建一个初始大小为例如1024 个元素,如果你然后 push_back 添加 个元素,那么向量的大小增加到 1025 个元素。

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