如果你不需要一个初始化为零的向量,那么将其初始化为零是不是浪费时间呢?
我尝试了这段代码:
#include <iostream>
#include <vector>
#include <array>
#define SIZE 10
int main()
{
#ifdef VECTOR
std::vector<unsigned> arr(SIZE);
#else
std::array<unsigned, SIZE> arr;
#endif // VECTOR
for (unsigned n : arr)
printf("%i ", n);
printf("\n");
return 0;
}
我收到了输出:
使用向量
$ g++ -std=c++11 -D VECTOR test.cpp -o test && ./test
0 0 0 0 0 0 0 0 0 0
使用数组
g++ -std=c++11 test.cpp -o test && ./test
-129655920 32766 4196167 0 2 0 4196349 0 1136 0
我也尝试使用clang++编译。
那么为什么是零呢?顺便问一下,我能声明一个未初始化的向量吗?
std::array
比std::vector
更好地遵循了“你不需要付出你不需要的代价”的原则。 - juanchopanzastd::vector
: 因为默认构造函数参数见(2):http://en.cppreference.com/w/cpp/container/vector/vector “使用值value构造count个元素的容器。” - Richard Crittenstd::array<...> arr{};
,则会发生这种情况。 - StoryTeller - Unslander Monicaunsigned()
进行默认初始化,则会将其默认初始化为0
。如果您不想进行默认初始化,请不要指定大小并调用reserve
以获取已初始化的空间。所有(8个)构造函数在值(或复制)初始化向量方面都是一致的。 - Richard Crittenstd::vector
提供替代方案,但对于std::array
则有。我认为这是一个设计缺陷,但也许在早期的C++中实现非零内置类型的清零太难了。 - juanchopanza