【问题标题】:Initialize Array to Default Value (Except where Specified) C++将数组初始化为默认值(除非指定) C++
【发布时间】:2020-06-21 12:43:56
【问题描述】:

我想声明一个大型数组,初始化时每个值都设置为 DEFAULT_VALUE,但整个数组中的三个值除外。

int array[2048] = { DEFAULT_VALUE };

将使用默认值填充整个数组,并且

int array[2048] = { [4] = VALUE_1, [123] = VALUE_2, [2047] = VALUE_3 };

将设置特定索引,其余设置为零(它在全局空间中),但是如何初始化数组以具有特定值和我自己的默认值?我可以编写自己的初始化例程吗?

顺便说一句,速度在这里是一个优先事项。

【问题讨论】:

  • 如果您不知道,第二个是特定于编译器的扩展,而不是标准 C++。
  • "写入 int array[2048] = { DEFAULT_VALUE }; 将使用默认值填充整个数组" - 不,它不会。它只会用DEFAULT_VALUE 填充第一个元素,其余元素将被初始化为0。

标签: c++ arrays initialization


【解决方案1】:

如果您不介意动态内存分配,我会使用 std::vector 之类的

std::vector<int> array(2048, DEFAULT_VALUE);
array[4] = VALUE_1;
array[123] = VALUE_2;
array[2047] = VALUE_3;

在这个live example中优化得很好

【讨论】:

    【解决方案2】:

    与许多优化问题一样,请在优化之前分析您的代码。我非常怀疑初始化这个数组在任何情况下都可能成为瓶颈。

    话虽如此,没有干净的语法。只需自己从合理的初始化例程中设置值。这就是编译器无论如何都会做的事情。

    考虑同时使用std::arraystd::vector

    【讨论】:

      【解决方案3】:

      我最终通过在我的程序中混合 c 和 c++ 来解决我的问题。我在适当的地方使用了“extern C”。使用 C 我可以写:

      int array[256] = { [0 ... 255] = DEFAULT_VALUE, [4] = VALUE_1 };
      

      将整个数组设置为我自己的默认值,除非另有说明。我喜欢干净的代码,所以切换到 C 来实现这一功能对我来说很有效。向量和堆不是选项,因为此代码将在嵌入式系统上运行。

      【讨论】:

        【解决方案4】:

        你可以使用std::valarray:

        std::valarray<int> v(DEFAULT_VALUE, 2048);
        v[std::_Sizarray{ 4, 123, 2034 }] = { VALUE_1, VALUE_2, VALUE_3 };
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-02-21
          • 2012-07-17
          • 1970-01-01
          • 1970-01-01
          • 2020-02-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多