【问题标题】:C++: Creating a Two-Dimensional Array of a StructC++:创建结构的二维数组
【发布时间】:2016-07-28 22:42:37
【问题描述】:

我有一个结构...

struct playerProbs {
int probPlayer1;
int probPlayer2;
};

还有一个二维数组 playerProbs killChart[11][11]=

我正在尝试将值添加到数组每个位置的每个结构中的 probPlayer1probPlayer2 中。所有的值都不同。我想知道最快、代码效率最高的方法是什么?

我查看了一些示例,但它们似乎都非常非常耗时。 感谢您的宝贵时间!

编辑:当前代码,

    struct playerProbs {
    int probPlayer1;
    int probPlayer2;
};

playerProbs killChart[11][11];

killChart[0][0].probPlayer1 = 30; //getting an error saying size of array 
killChart[0][0].probPlayer2 = 30; //must be bigger than 0

【问题讨论】:

  • 所以你想填充这个二维数组?由于您只有 121 个元素(几乎没有),因此只需使用双嵌套 for 循环。到目前为止,这将是最容易编码的,而 n 如此小的效率是无关紧要的。 (你已经有了 O(n) 的效率)。
  • 你用什么编译这个?我刚刚运行了您发布的“当前代码”,它运行良好。
  • 我正在使用 Visual Studios 2010

标签: c++ arrays multidimensional-array struct int


【解决方案1】:

您只是在填充一个非常小的数据集,因此只需使用嵌套的 for 循环。

for(int i(0); i < 11; ++i)
    for(int j(0) j < 11; ++j)
        killChart[i][j].probPlayer1 = x;
        killChart[i][j].probPlayer2 = y;
    }
}

在 cmets 中根据请求进行编辑,这是您以手写方式输入这些内容的方式。 要分配给定值,让我们使用:

killChart[0][0].probPlayer1 = 30;
killChart[0][0].probPlayer2 = 30;

killChart[0][1].probPlayer1 = 30;
killChart[0][1].probPlayer2 = 30;

/// ........
killChart[10][10].probPlayer1 = 30;
killChart[10][10].probPlayer2 = 30;

// And so on and so forth for all values

可以运行的完整代码(样本量小得多,只有一个 2x2 数组)如下所示:(我不想输入所有 121 个值,这演示了使用它的两种方法。)

struct playerProbs {
    int probPlayer1;
    int probPlayer2;
    playerProbs(int _v1, int _v2) : probPlayer1(_v1), probPlayer2(_v2){}
};

int main()
{


playerProbs killChart[2][2] = 
                {   // Assign via bracket initialization
                    { playerProbs(30,30), playerProbs(30,30) },
                    { playerProbs(30,30), playerProbs(30,30) },
                };

// Assign via individual initialization. 
killChart[0][0].probPlayer1 = 30;
killChart[0][0].probPlayer2 = 30;
killChart[0][1].probPlayer1 = 30;
killChart[0][1].probPlayer2 = 30;
killChart[1][0].probPlayer1 = 30;
killChart[1][0].probPlayer2 = 30;
killChart[1][1].probPlayer1 = 30;
killChart[1][1].probPlayer2 = 30;
return 0;
}

【讨论】:

  • 我想我的问题措辞有误。例如killChart[0][0]=probPlayer1.x=.3 probPlayer1.y=.3killChart[0][1]=probPlayer1.x=.1 probPlayer1.y=.15 数组中的所有字段都不同
  • @BeccaBohem 您如何决定这些价值观?如果您想在编译时分配静态值,那么您可能需要长期编写代码。否则,如果您使用某种算法来确定这些值,那么您可能会找到一种方法将其作为 i 和 j 的函数,并让 for 循环为您分配数字。否则,您是否可以提供任何关于如何使用它们的信息,这些信息与填充其价值观的其他方式相关?
  • 我相信我只需要长期观察,看看这些价值观背后没有韵律或理由,你能给我举一个例子,说明我是如何为@输入值的987654327@ 的值为probPlayer1=30, probPlayer2=30?我已经很久没有用 C++ 编写代码了,我很难搞清楚
  • 你不能在多维数组上使用大括号初始化吗? (stackoverflow.com/questions/4981197/2d-array-values-c)
  • @vu1p3n0x 你绝对可以,但是我认为这种用法的可读性会高得多。 (嵌套大括号初始化变得非常混乱,并且通常需要更长的时间来完成,因为你不断地失去你的位置。)(尤其是必须声明结构的值,[你需要一个构造函数])老实说,我可能会写一个脚本来输入语法,你只需输入值。
【解决方案2】:

另一种选择是使用大括号初始化

struct playerProbs {
    int probPlayer1;
    int probPlayer2;
};

playerProbs killChart[11][11] = {
    { {1, 2}, {3, 4}, {5, 6}, {7, 8}, ... }, // 11 { , }s
    { {4, 7}, {3, 5}, {0, 4}, {1, 6}, ... },
    ...                                      // x11
}

尽管正如 Chris 所说,在 11x11 元素下可能很难阅读。

【讨论】:

  • 您还必须为 probPlayer1 成员和 probPlayer2 成员分配值。 (killChart 是一个结构数组,而不是整数)您需要为 playerProbs 声明一个构造函数来分配值。
  • 如果 Visual Studio 2010 有正确的 c++11 聚合初始化,那么你不需要构造函数,但我不相信 VS2010 for c++11
猜你喜欢
  • 2012-02-28
  • 2021-09-22
  • 1970-01-01
  • 1970-01-01
  • 2019-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-21
相关资源
最近更新 更多