初始化稀疏静态数组

Posted

技术标签:

【中文标题】初始化稀疏静态数组【英文标题】: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 中,它们将其作为扩展提供)。但是,不支持非平凡(即您的示例)。 【参考方案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。

以上是关于初始化稀疏静态数组的主要内容,如果未能解决你的问题,请参考以下文章

Java数组定义和使用(详解)

c99数组稀疏初始化

Java面试会问的——数组声明初始化冒泡多维数组稀疏数组

golang数据结构之稀疏数组

C++中的稀疏数组

如何将 numpy.matrix 或数组转换为 scipy 稀疏矩阵