gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:26:38 26 4
gpt4 key购买 nike

当你不想要它时,用零初始化一个 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com