c++ - 为什么 C++ 用零初始化 std::vector 而不是 std::array?

标签 c++ vector

当你不想要它时,用零初始化一个 vector 不是浪费时间吗?

我试试这段代码:

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

我得到了输出:

用 vector

$ 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++

那为什么是零呢?顺便问一下,我可以在不初始化的情况下声明一个 vector 吗?

最佳答案

更常见的声明 vector 的方式是不指定大小:

std::vector<unsigned> arr;

这不会为 vector 内容分配任何空间,也没有任何初始化开销。通常使用 .push_back() 等方法动态添加元素。如果你想分配内存,你可以使用 reserve():

arr.reserve(SIZE);

这不会初始化添加的元素,它们不会包含在 vector 的 size() 中,并且尝试读取它们是未定义的行为。比较一下

arr.resize(SIZE);

增长 vector 并初始化所有新元素。

另一方面,

std::array 总是分配内存。它实现了大多数与 C 风格数组相同的行为,除了自动衰减到指针。这包括默认情况下不初始化元素。

关于c++ - 为什么 C++ 用零初始化 std::vector 而不是 std::array?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48775464/

相关文章:

c++ - C++中非指针数组的删除

C++ createObject() 工厂

C++11:保证来自模板参数的非转换引用

c++ - 如何修复( 'vector' : undeclared identifier ) in my header file?

c++ - 如何将 Kinect 2.0 的深度数据转换为距离值?

c++ - 如何使用 C++ 模板创建具有任意数量 case 的 switch 语句生成器?

c++ - 从字符串 vector 中获取字符串的第一个字符

c++ - 为什么我的代码无法处理大数组输入(>10000)?

c++ - 优化对指针 vector 的 new 调用?

c++ - 相同类型之间的无效转换