【问题标题】:initializing a const multidimensional array in c++在 C++ 中初始化一个 const 多维数组
【发布时间】:2009-11-02 18:00:17
【问题描述】:

我目前正在编写一本 c++ 书籍中的一些练习,该书籍使用基于文本的游戏作为其教学工具。我坚持的练习包括让电脑从 const 单词(字符串)数组中选择一个单词,混合字母并让玩家猜测这个单词。这很简单,但正如本书的后续要求添加选项以向玩家提供提示以帮助他们猜测,首先作为并行数组(同样,没问题),然后作为二维数组。这就是我卡住的地方。我的(缩短的)单词数组如下:

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

我需要为这些单词中的每一个提供一个提示,但不知道如何去做。从手机上发布如此广泛的谷歌搜索不是一种选择!

我的并行数组如下:

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

只需要将两者结合起来。

提前致谢, 巴里

【问题讨论】:

    标签: c++ arrays constants multidimensional-array


    【解决方案1】:

    你可以制作二维数组吗?

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

    不确定语法是否正确,但我希望你明白这个概念。

    它是另一个数组中的一个数组。

    已编辑:我从第一个方括号中删除了 NUM_WORDS。你不能从变量中声明多维数组。对不起,我忘记了。我刚刚测试了它,它可以工作。

    【讨论】:

      【解决方案2】:

      使用结构体数组:

      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);
      

      【讨论】:

        【解决方案3】:

        嗯... 也许你应该使用pair struct?

        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] 我真的不明白这个问题
        • 您还可以考虑成对的字符串向量,这可以使编码更容易并减少错误。 std::vector> 注意末尾的 >> 之间的空格。虽然无法使用单个语句进行初始化(afaik)
        • 是的,我知道,但是向量没有使用 {} 进行初始化,只能通过复制 c 数组来进行。
        • 谢谢小鬼。我已经使用 2 个数组完成了它,但问题的下一部分需要一个 2 维数组。
        【解决方案4】:

        这是一个简单的示例,它将从您已经拥有的其他两个数组中为您提供一个二维数组[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”图标。
        【解决方案5】:

        虽然本书告诉您使用 2 个数组,但更好的方法是使用结构数组,这样您就可以按名称而不是整数索引来访问单词和提示。 ad hoc 结构也比一对好,因为您可以命名成员。 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?
        • sizeof(string)?!!! sizeof class != 字符串的字符大小。 sizeof string 将更大或更小 - 取决于实现。但这是错误的!这个 c-arrays 上的 sizeof 技巧只适用于 POD 类型。
        • 第一个变体也是错误的。只是测试它。 sizeof(string("abcd")) 不会是 4 或 5,例如可能是 32
        • barry - 字符串或任何其他对象占用 X 字节内存,因此 sizeof(string) 将返回 X。在版本 2 中,我在 array2 中有 6 个字符串,因此 sizeof(array2) 将返回 6* X。但是,由于我假设 2D 数组是字符串对的 1D 数组,因此我必须将数组中使用的字节数除以 2 以获得数组中的条目数。因此 NUM_WORDS = ((6*X)/(X))/2。
        • f0b0s - 我不关心给定字符串中的字符数,因为 NUM_WORDS 不依赖于数据集中任何给定字符串的长度。我只关心数组中的条目数,所以 sizeof(array)/sizeof(element) 给了我我需要的东西。
        猜你喜欢
        • 2013-04-04
        • 2014-05-11
        • 1970-01-01
        • 1970-01-01
        • 2021-04-04
        • 2011-04-03
        • 2015-02-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多