是否将实现定义为使用保留向量而不调整大小?
我的意思是:
#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仅接受从文件解码的向量。
答案 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()
之前的迭代器相同。