初始化稀疏静态数组
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。以上是关于初始化稀疏静态数组的主要内容,如果未能解决你的问题,请参考以下文章