【问题标题】:initialize a vector to zeros C++/C++11将向量初始化为零 C++/C++11
【发布时间】:2012-10-28 15:26:18
【问题描述】:

我知道在 C++11 中他们添加了将变量初始化为零的功能

double number = {}; // number = 0
int data{};  // data = 0

是否有类似的方法将固定长度的std::vector 初始化为全零?

【问题讨论】:

  • std::vector<int> vec(42);
  • 顺便说一句,这在c++11中不是新的,你也可以在以前的版本中这样做

标签: c++ c++11


【解决方案1】:

你不需要初始化列表:

std::vector<int> vector1(length, 0);
std::vector<double> vector2(length, 0.0);

【讨论】:

  • 您不需要明确声明 0 是吗? vector(length) 应该可以吗?
  • @jozefg:是的,它会起作用,尽管明确说明您希望代码做什么并没有什么坏处。
  • @ronag 我写了我自己的答案,因为如果 int 不是他正在使用的类型,那么在这种情况下明确不一定是一个很好的例子。通用编程在 C++ 中可用,但是当我被提醒您可以完全省略该参数时,我删除了我的答案。
  • 是否可以在不使用 for 循环的情况下有效地重新初始化 Global Vector 的所有元素 withZERO??????
  • 好吧,我刚刚试了一下,结果向量充满了垃圾值:std::vector&lt;uint8_t&gt; inputBuffer(totalSize, 0);
【解决方案2】:

可以通过这种方式初始化具有结构、类或联合的向量

std::vector<SomeStruct> someStructVect(length);
memset(someStructVect.data(), 0, sizeof(SomeStruct)*length);

【讨论】:

  • 这对于内置类型(int 等)和 POD 来说是可以的,但对于具有 1. 虚拟方法的类会带来巨大的问题(因为 vtable 指针会设置为0) 或2. 不变量某些字段不是0(通常由构造函数和方法强制执行)。
  • 除了对微不足道的类型之外的任何东西都很危险,你写的东西毫无意义:构造大小为length的向量已经默认初始化所有新元素。如果以后需要对所有元素进行默认初始化,或者将它们全部设置为其他值,则应使用std::fill(),因为它实际上是 C++ 并且是类型安全的。
【解决方案3】:

对于最新版本的 c++,您可以使用 std::fill。

我注意到有人提到它作为评论。但应该是一个答案,并鼓励使用专家提到的标准库算法,经过很好的测试和证明。

    std::vector<int> vecOfInts;
    vecOfInts.resize(10);

    std::fill(vecOfInts.begin(), vecOfInts.end(), 0);

    for (auto const& intVal : vecOfInts)
    {
        std::cout << intVal << " ";
    }

【讨论】:

  • 将 10 个值放入向量中的是调整大小方法,而不是仅替换现有值的填充。
  • OP 在他的问题中指定了“固定长度”。 10 是一个例子。
猜你喜欢
  • 2018-09-30
  • 2010-12-26
  • 2016-10-12
  • 2018-07-26
  • 1970-01-01
  • 1970-01-01
  • 2012-12-08
  • 2012-06-21
  • 2013-05-10
相关资源
最近更新 更多