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

时间:2015-02-06 19:09:59

标签: c++ vector

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

我的意思是:

#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打电话&#34;调整大小&#34;向量并为每个元素提供一个默认值(我试图避免)。因此,foo.size()为0,而foo.capacity()为1024。

这是有效的代码还是实现定义的?看到我正在使用&#34; 0&#34;分配向量。尺寸。它有效,但我不确定它是不是一个好主意......

我试图避免默认值的原因是因为对于大量分配,我不需要它&#34;归零&#34;当我想要写它时,我将决定每个索引。我使用原始指针,但lodepng API仅接受从文件解码的向量。

2 个答案:

答案 0 :(得分:4)

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

如果您想要一个初始尺寸1024元素的向量,您可以使用constructor来执行此操作:

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

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

答案 1 :(得分:2)

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