如何在函数内部创建一个数组,然后使用该数组创建另一个数组?

时间:2019-05-23 18:09:37

标签: c++ visual-c++

我是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的数组。

3 个答案:

答案 0 :(得分:4)

据我从您的Python代码了解,您想创建一个2D数组。对于C ++的完整初学者而言,这可能是一项艰巨的任务。许多人建议使用std::vector,它们是正确的,但是使用这种容器的2D“数组”可能非常慢。因此,当您获得更多有关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

答案 1 :(得分:3)

几乎可以保证逐行翻译代码会失败。您最好分两个步骤进行操作: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中超出范围的元素。有效索引为0x-1,因为l具有x元素。超出范围访问数组是未定义的行为。我们可以在这一点上停止,因为在发生不确定行为之前,任何事情都可能发生。但是,y, l[x]调用逗号运算符。它评估双方,并得出正确的操作数。然后,您再次遇到相同的问题,l[x]没有编译时间常数。

在这个地方,我有c ++代码,但事实证明我完全误解了您的代码应该做什么。我将留下答案,并把您推荐给其他人。

答案 2 :(得分:1)

您的代码有几个问题。主要的是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;
}