【问题标题】:c++ how to initialize const elements of an arrayc ++如何初始化数组的const元素
【发布时间】:2017-11-06 19:22:30
【问题描述】:

我需要一种方法来为我当前正在处理的程序初始化数组的 const 元素。 问题是我必须用函数初始化这些元素,没有办法像这样:

const int array[255] = {1, 1278632, 188, ...};

因为我必须生成大量数据。 我尝试将 memcpy 数据保存到 const int 中,但这不起作用,也没有起作用。

 const int array[255];

 void generateData(){
      for(int i = 0; i < 255; i++) {
          initializeSomehowTo(5, array[i]);
      }
 }

我希望你明白我在尝试什么,对不起,如果我重复了这个问题,我一定忽略了它。

【问题讨论】:

  • 你不能使用const int array[255] = initializeMyArray(),但是如果你使用std::array,你可以使用const std::array&lt;int, 255&gt; = initializeMyArray()

标签: c++ arrays initialization constants


【解决方案1】:

这个怎么样?

#include <array>
typedef std::array<int, 255> Array;

const Array array = generateData();

Array generateData(){
    Array a;
    for(int i = 0; i < a.size(); i++) {
        initializeSomehowTo(a[i]);
    }
    return a;
}

【讨论】:

  • 这很好用,唯一的问题是 const int array[10][10][10]; 看起来真的很可怕:const std::array, 10>, 10> 数组; ;-)
【解决方案2】:

最简单的方法是从函数中获取填充的数组,并使用它来初始化您的const(或constexpr)对象。但是,无法复制内置数组,但std::array&lt;T, N&gt; 是:

std::array<T, 255> array = initializeData();

如果你需要一个内置数组,我可以想象初始化一个类的 static 成员(实际上是模板),其中索引从 std::make_index_sequence&lt;255&gt; 扩展的索引扩展并用作数组中的位置参数,即,类似以下内容:

#include <algorithm>
#include <iostream>
#include <iterator>
#include <utility>

int some_function(std::size_t i) { return i; }

template <typename> struct initialized_array_base;
template <std::size_t... I>
struct initialized_array_base<std::index_sequence<I...>> {
    static const int array[sizeof...(I)];
};

template <std::size_t... I>
int const initialized_array_base<std::index_sequence<I...>>::array[sizeof...(I)]
    = { some_function(I)... };

struct initialized_array
    :initialized_array_base<std::make_index_sequence<256>> {
};

int main() {
    std::copy(std::begin(initialized_array::array),
              std::end(initialized_array::array),
              std::ostream_iterator<int>(std::cout, " "));
    std::cout << '\n';
}

【讨论】:

  • 哇,这么简单的任务看起来很可怕;-)
【解决方案3】:

您可以创建一个可写数组,对其进行初始化,然后创建一个对它的 const 引用。

int arry[255];

void generateData(){
  for(int i = 0; i < 255; i++) {
      initializeSomehowTo(5, arry[i]);
  }
}

const int (&array)[255] = arry;

【讨论】:

  • 这不会阻止 arry 被修改,对吧?
  • 我认为您也可以将 std::static_cast 转换为 const 引用
  • 额外的间接级别(对于也具有静态存储的引用变量)可能无法优化。 我绝对建议不要使用它,因为从初始化函数返回 std::array&lt;&gt; 可以避免任何性能下降。
猜你喜欢
  • 2015-01-28
  • 1970-01-01
  • 2010-09-14
  • 2016-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多