【问题标题】:Initialize sparse static array初始化稀疏静态数组
【发布时间】:2012-07-04 03:53:06
【问题描述】:

我需要初始化一个静态数组。并非所有值都是连续的。

这样的东西对顺序数组很有效:

class Foo {

  public:

  static const char * name[];

}

const char * Foo::name[] = { "Sun", "Moon" };

如何在数组中的任意位置赋值?我需要做这样的事情(伪代码):

const char * Foo::name[] = { 67: "Sun", 68: "Moon" };

数组永远不会大于 255;索引来自字节值。


我发现 part of a thread 有人给出了一个与我想要的类似的例子,但我无法让这样的事情起作用。

type array[SIZE] = {[SIZE-4]=1, 2, 3, 4};

【问题讨论】:

  • [SIZE-4]=1 被称为指定初始化器,仅在 C 中可用,在 C++ 中是非法的(但是,在 gcc 中,它们将其作为扩展提供)。但是,不支持非平凡(即您的示例)。

标签: c++ arrays static initialization


【解决方案1】:

我建议您使用std::map<int, std::string>(或unordered_map,如果您支持C++11)而不是数组。然后,您可以使用代码:m[67] = "Sun" 插入此地图并使用 std::string s = m[67]; 检索项目。

【讨论】:

  • 谢谢,但如果可能的话,我想在不导入任何库的情况下这样做。
  • @GGG:它是 C++ 标准库的一部分。不需要额外的库。
  • 这将与其余代码不同。为什么建议使用 std::strings 而不是 const char *?代码以类 c 的方式编写,封装在类中。
  • @GGG: 你可以使用const char*,我建议使用std::string,因为人们通常会忘记char*const 部分,并将其用作具有以下功能的非char* 指针strcpy。这将导致程序崩溃。
【解决方案2】:

这是一种老式的方法:

class NameArray {
  public:
    NameArray()
    {
      array[67] = "Sun";
      array[68] = "Moon";
    }

    const char *operator[](size_t index) const
    {
      assert(index<256);
      return array[index];
    }


  private:
    const char * array[256];
};

class Foo {
  public:
    static NameArray name;
};

NameArray Foo::name;

通过将数组包装在一个类中,您可以确保使用您想要的值构造它。你也可以做边界检查。

【讨论】:

  • 如果我要这样做,NameArray 应该是单例吗?
  • @GGG:如果单例是指删除复制或分配的能力,请确定这是否是您想要的。
  • 我的意思是,这并没有真正具有静态的优势,我认为单例模式可以解决这个问题,但它似乎有点矫枉过正。我真的只想要一个普通的静态稀疏数组。没有办法吗?
  • @GGG:我不确定你的意思。它仍然在 Foo 类中声明为静态的。
  • 嗯,好点,我在想其他东西需要实例化 NameArrays,但他们只会看 Foo::name。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-25
  • 1970-01-01
  • 2016-10-28
  • 2011-04-18
  • 1970-01-01
相关资源
最近更新 更多