【问题标题】:How can I create an array inside a function then use this array to create another array?如何在函数内部创建一个数组,然后使用该数组创建另一个数组?
【发布时间】:2019-05-23 18:09:37
【问题描述】:

我是 C++ 的新手,我正在学习用 python 编写代码。 我相信解决方案很简单,但我不知道该怎么做。

这是我在 C++ 中尝试做的事情(不工作):

int createBoard(int x, int y) {
    int l[x];
    int board[y, l[x]];
    return board;
}
int main() {
    int x = 5;
    int y = 6;
    board = createBoard(x,y);
    return 0;
}

这是我想要复制的内容(工作,但在 python 中):

def createBoard(x,y):
    length = [i for i in range(0,10)]
    area = [y,length]
    return area

area = createBoard(5,6)

基本上我想创建一个函数,该函数返回一个带有 y 值的数组和一个计数到 x 的数组。

【问题讨论】:

  • int l[x]; 不是合法的 c++。
  • 为此使用 std::vector 而不是数组。
  • 假设你的编译器允许int l[x];通过一些扩展,你期望l[x]在下面的行中得到什么?
  • 另一个问题是返回类型int createBoard(int x, int y) { 你承诺返回一个整数。而已。虽然这样说你不能返回一个 c 数组。您可以返回std::vector

标签: c++ visual-c++


【解决方案1】:

据我从您的 Python 代码中了解到,您想要创建一个二维数组。对于一个完整的 C++ 初学者来说,这可能是一项具有挑战性的任务。许多人建议使用std::vector,他们是对的,但是使用这种容器的二维“数组”可能会非常慢。因此,当您获得更多 C++ 经验时,此示例将有效,但在未来的情况下不受欢迎:

#include <vector>

std::vector< std::vector<int> > createBoard(size_t x, size_t y)
{
    return std::vector< std::vector<int> >(x, std::vector<int>(y));
}

因此,如果您想使用更有效的方式创建 2D 数组,请参阅以下示例: LINK

【讨论】:

  • 但这会创建向量的x 副本。 Python 程序创建一个包含两个元素的数组,第一个是整数,第二个是数组。
  • @oz1cz 不,它没有。您创建一个指针,它将为您动态分配堆中的内存。我不知道 Python 在内部是如何处理的,但我很确定它在内部也是如此
  • 我认为你错了。如果您运行 Python 代码,然后打印 area 的值,您会得到以下输出:[6, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]]
  • 从上面的代码中我可以理解,它似乎以一种有趣的方式解决了这个问题,稍后会对其进行测试并提供反馈,谢谢
【解决方案2】:

逐行翻译代码几乎肯定会失败。你最好分两步来做:1)完全理解A语言的代码是做什么的。 1a) 忘记语言 A 的代码。 2) 用语言 B 写同样的代码。

我对python不是很精通,所以我从这个开始:

基本上我想创建一个函数,它返回一个带有 y 的数组 值和一个数组,直到 x。

您声明函数返回单个int。单个int 不是两个数组。

接下来,这个

int l[x];

不是标准 C++,因为x 不是编译时间常数。一些编译器将它作为扩展提供,但没有理由使用它,因为 c++ 有 std::vector

那么,这个

int board[y, l[x]];

在多个方面存在问题。 l[x] 正在访问数组 l 中超出范围的元素。有效的索引是0 直到x-1,因为lx 元素。越界访问数组是未定义的行为。我们可以在这一点上停下来,因为在未定义的行为之前,任何事情都可能发生。但是,y, l[x] 调用逗号运算符。它评估双方并产生正确的操作数。然后你又遇到了同样的问题,l[x] 没有编译时间常数。

在这个地方我有 C++ 代码,但结果我完全误解了你的代码应该做什么。我会留下答案并将您转介给其他人以寻求解决方案。

【讨论】:

  • 有意思,会进一步研究。
【解决方案3】:

您的代码存在几个问题。主要是Python数组area包含两种不同类型的对象:第一种是整数y,第二种是数组length。 C++ 数组的所有元素必须具有相同的类型。

根据您的用途,您可以将board 数组替换为std::pair。这是一个包含两个不同类型元素的对象。

此外,在 C++ 中,必须动态创建具有非常量长度的数组。使用new 运算符或(更好)使用std::unique_ptr。 (或者您可能想改用std::vector。)

这是一个小型 C++ 程序,它执行您想做的事情:

#include <utility>
#include <memory>

auto createBoard(int x, int y) {
    return std::make_pair(y, std::make_unique<int[]>(x));
}

int main() {
    auto board = createBoard(5,6);

    return 0;
}

(仅当您的编译器支持 C++14 或更高版本时才有效。)

但这实际上远远高于“新手”水平,我怀疑你会发现它很有用。

最好从你的程序应该做什么的规范开始,而不是尝试从 Python 翻译代码。

编辑

std::vector 相同的代码,而不是动态数组:

#include <utility>
#include <vector>

auto createBoard(int x, int y) {
    return std::make_pair(y, std::vector<int>(x));
}

int main() {
    auto board = createBoard(5,6);

    return 0;
}

【讨论】:

  • 我觉得你的例子太复杂了,没必要。为什么要使用make_unique 来完成制作二维数组这样简单的任务?其次,OP 将无法像在 python 中那样通过[] 访问板子
  • 为此首选std::vector 而不是std::unique_ptr,除非您有充分的理由选择后者。
  • 点了。我添加了一个带有std::vector 的版本。
  • 感谢您的解释!会考虑到这一点并进行测试。
  • 如何访问您的任何代码中的信息?
猜你喜欢
  • 1970-01-01
  • 2012-04-13
  • 2012-12-16
  • 2017-05-06
  • 2013-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多