实现定义为使用保留向量而不调整它的大小?
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
不用分配内存。它不会改变向量的大小。
如果你想要一个初始 size 个 1024
元素的向量,你可以使用 constructor 来做到这一点:
std::vector<unsigned int> foo(1024);
请注意,如果您创建一个初始大小为例如1024
个元素,如果你然后 push_back
你 添加 个元素,那么向量的大小增加到 1025
个元素。
这是非法的,无论容器中的项目类型如何或在特定编译器上似乎发生了什么。从 23.1.1/12 (Table 68) 我们了解到 operator[]
的行为类似于 *(a.begin() + n)
。由于您尚未向容器添加任何项目,这与访问未定义的迭代器 end()
相同。
是否将实现定义为使用保留向量而不调整它的大小?
我的意思是:
#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
不用分配内存。它不会改变向量的大小。
如果你想要一个初始 size 个 1024
元素的向量,你可以使用 constructor 来做到这一点:
std::vector<unsigned int> foo(1024);
请注意,如果您创建一个初始大小为例如1024
个元素,如果你然后 push_back
你 添加 个元素,那么向量的大小增加到 1025
个元素。
这是非法的,无论容器中的项目类型如何或在特定编译器上似乎发生了什么。从 23.1.1/12 (Table 68) 我们了解到 operator[]
的行为类似于 *(a.begin() + n)
。由于您尚未向容器添加任何项目,这与访问未定义的迭代器 end()
相同。