在C++中初始化一个常量多维数组

6

我目前正在一本C++书中完成一些练习,这本书以文本游戏作为教学工具。我卡在的练习是让电脑从一个包含单词(字符串)的const数组中选择一个单词,将字母打乱并要求玩家猜测该单词。这很简单,但随后这本书要求我添加选项,为玩家提供提示以帮助他们猜测,首先作为平行数组(同样没有问题),然后作为二维数组。这就是我卡住的地方。我的(缩短的)单词数组如下:

const string WORDS[NUM_WORDS] = {"wall", "glasses"};

我需要为这些单词提供提示,但不确定如何处理。由于我是从手机上发布的,因此无法进行大量搜索!

我的并行数组如下:

const string HINTS[NUM_WORDS] = "brick...", "worn on head"};

只需要将这两个内容合并即可。

提前感谢, 巴里

5个回答

17

你可以创建一个二维数组吗?

string aArray[][2] = {{"wall", "brick..."}, 
                               {"glasses", "corrective eye tool thingymajig"},
                               {"calculator", "number cruncher"}};

不确定语法是否正确,但希望你能理解概念。

这是一个嵌套数组。

编辑:我从第一个方括号中删除了NUM_WORDS。无法使用变量声明多维数组。抱歉我忘记了这一点。我刚刚测试了一下,它可以工作。


6
使用结构体数组:
typedef struct
{
    string Word;
    string Hint;
}
WORDDEF;

const WORDDEF WordList[] =
{
    {"wall", "brick..."},
    {"glasses", "worn on head"},
    ...
};

然后,您会称呼它们为:
printf ("For entry %d, Word is %s, Hint is %s\n", 1, WordList[1].Word, WordList[1].Hint);

0

嗯... 也许你应该使用配对结构体?

std::pair<std::string, std::string> WORDS[10] = { make_pair("wall", "brick"), 
                                                  make_pair("glasses, worn") }

现在,你可以使用WORDS[i].first - 作为未知单词

和 WORDS[i].second 作为它的提示。


可能您只需要使用相同索引的数组: word = WORDS[i],hint = HINTS[i] 我真的不太了解这个问题。 - f0b0s
你也可以考虑使用一组字符串对的向量,这可能会使编码更容易,减少错误。std::vector< std::pair< std::string, std::string > >请注意,末尾的> >之间有一个空格。不过,使用单个语句进行初始化似乎是不可能的。 - pxb
是的,我知道,但向量(vectors)不能使用{}进行初始化,只能通过复制C数组进行初始化。 - f0b0s
谢谢foobs。我已经使用了2个数组完成了它,但问题的下一部分需要一个二维数组。 - barry

0

这里有一个简单的例子,可以从你已经拥有的两个数组中获取一个二维数组[2][2],作为起点。

#include "stdafx.h"
#include "iostream"
#include "string"

#define NUM_WORDS 2
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    const string WORDS[NUM_WORDS] = {"wall", "glasses"};
    const string HINTS[NUM_WORDS] = {"brick", "worn on head"};

    string hw[NUM_WORDS][NUM_WORDS];

    for(int i=0; i < NUM_WORDS; i++)
        for(int j=0; j < NUM_WORDS; j++)
        {
            if(i > 0)
                hw[i][j] = HINTS[j];
            else if(j > 0)
                hw[i][j] = WORDS[i+1];
            else
                hw[i][j] = WORDS[i];
        }
    for(int i=0; i < NUM_WORDS; i++)
        for(int j=0; j < NUM_WORDS; j++)
        {
            cout << "hw[" << i << "][" << j << "]= " << hw[i][j] << endl;
        }

    char c;
    cin.get(c);
    return 0;
}

由于某些原因,无论我做什么,该框都不会让我复制和粘贴代码,以便正确格式化。抱歉。


你必须使用4个空格进行代码缩进(如果代码在列表后面,则使用8个空格)。您可以通过突出显示代码,然后单击“1010”图标来实现此操作。 - GManNickG

-1

虽然书上告诉你使用2个数组,但更好的方法是使用结构体数组,这样你可以通过名称而不是整数索引访问单词和提示。自定义结构体也比一对更好,因为你可以为成员命名。在C++中另一个有用的技巧是使用sizeof运算符让编译器计算数组元素的数量。这减少了代码中的冗余,从而降低了出错的可能性。

int main(){
  /////////////version 1 - the way I would do it
  struct element{
    string word;
    string hint;
  };

  const element array[] = {
    {"wall", "brick..."},
    {"glasses", "corrective eye tool thingymajig"},
    {"calculator", "number cruncher"}
  };    
  const size_t NUM_WORDS = sizeof(array)/sizeof(element);

  for(size_t i=0; i<NUM_WORDS; i++){
    cout << array[i].word << ": " << array[i].hint << endl;
  }

  /////////////version 2 - the way the book asks for it
  const string array2[][2] = {
    {"wall", "brick..."},
    {"glasses", "corrective eye tool thingymajig"},
    {"calculator", "number cruncher"}
  };    
  const size_t NUM_WORDS2 = sizeof(array2)/(sizeof(string)*2);

  for(size_t i=0; i<NUM_WORDS2; i++){
    cout << array2[i][0] << ": " << array2[0][1] << endl;
  }    
}

谢谢你的回答。获取数组大小时,为什么需要将sizeof()乘以2? - barry
sizeof(string)?!!! sizeof class != string中字符的大小。 字符串的sizeof大小将会更大或更小——取决于实现方式。但它是错误的!在C数组上使用sizeof技巧只适用于POD类型。 - f0b0s
只是测试一下。sizeof(string("abcd")) 不会是4或5,例如它可能是32。 - f0b0s
barry - 一个字符串或任何其他对象占用X字节的内存,因此sizeof(string)将返回X。在版本2中,我有6个字符串在array2中,因此sizeof(array2)将返回6 * X。但是,由于我假装2D数组是一对字符串的1D数组,因此必须将数组中使用的字节数除以2以获取数组中条目的数量。因此NUM_WORDS = ((6 * X) / (X)) / 2。 - SigmaXiPi
f0b0s - 我不关心给定字符串的字符数,因为NUM_WORDS不依赖于数据集中任何给定字符串的长度。我只关心数组中的条目数,所以sizeof(array)/sizeof(element)可以给我所需的结果。 - SigmaXiPi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接