C ++ - 相当于C中未完全初始化的数组?

时间:2013-02-27 09:03:09

标签: c++ c

当我将代码从C转换为C ++时,我有时会遇到C语言构造,但与C ++兼容。通常我想以最少侵入性的方式转换代码。但我有一个案例,我发现这很困难:

在C中,你可以使用“指示符”声明一个数组并初始化 ...好...... 部分 ,其余部分归零(编辑:我在这里写了“留给随机性”,第一部分)

int data[7] = {
    [2] = 7,
    [4] = 9,
};

这不是有效的C ++代码(幸运的是)。所以我将不得不使用不同的策略。

虽然我可以在C ++ 11中看到一种非侵入性的方式:

static const map<int,int> data = { {2,7}, {4,9} };

当C ++ 11功能尚不可用时,我该怎么办?

  • 我可以规避运行时初始化吗?
  • 有没有办法以“literal”的方式初始化类似的映射?
  • 使用data的代码的最少侵入性是什么?

5 个答案:

答案 0 :(得分:11)

除非阵列的大小完全是疯了,否则你总能做到这一点

int data[7] = {
    0,
    0,
    7, // #2
    0, 
    9  // #4
    // the rest will be 0-initialized
};

也适用于编译时

答案 1 :(得分:6)

如果无法进行统一初始化,则可以使用boost::assign::map_list_of初始化std::map<int, int>

#include <boost/assign/list_of.hpp>
static const std::map<int,int> data = boost::assign::map_list_of(2,7)(4,9);

答案 2 :(得分:3)

而不是使用map<int, int>,您可以从C ++ 11向后移植std:array(或最小等价物),并使用Boost.Assign样式的构建器工具:

#include <cstddef>

template<typename T, size_t N> struct array { T data[N]; };
template<typename T, size_t N> struct build_array: public array<T, N> {
   build_array &operator()(size_t i, const T &t) {
      this->data[i] = t;
      return *this;
   }
};

array<int, 7> data_array = build_array<int, 7>()(2, 7)(4, 9);
int (&data)[7] = data_array.data;

答案 3 :(得分:1)

你为什么不能这样做:

int data[7];
data[2] = 7;
data[4] = 9;

看起来非常相似=)

答案 4 :(得分:1)

如果您不想使用boost::assign 您可以创建它的简单模拟:

template<class T1, class T2>
std::map<T1, T2> cre(std::map<T1, T2> & m)
{
   return std::map<T1, T2>();
}

template<class T1, class T2>
std::map<T1, T2> & ass(std::map<T1, T2> & m, T1 const & p1, T2 const & p2)
{
   m[p1] = p2;
   return m;
}

std::map<int, int> data = ass(ass(cre(data), 2, 3), 7, 6);