首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >中初始化的函数之外的特定大小的数组。

中初始化的函数之外的特定大小的数组。
EN

Stack Overflow用户
提问于 2017-03-06 13:53:59
回答 5查看 204关注 0票数 4

我是一个高中生,学习编程,我有一个问题,我不知道如何解决。

我有一个整数"x",我想要一个矩阵"mat“的大小为"x":

代码语言:javascript
运行
复制
int mat[x][x];

但这只适用于我读过xx

例如,如果是x == 5,则等效为

int mat[5][5];

代码语言:javascript
运行
复制
#include <iostream>
using namespace std;

int x;

int mat[x][x];

void f(int mat2[x][x])
{

}

int main()
{
    cin >> x;
    int m[x][x];
    f(m);
}

我写了这个简短的程序来说明它在哪里工作,它不起作用。

错误:数组绑定不是']'令牌之前的整数常数

函数void f中的全局声明和声明都有错误。它只编译没有错误的main()

我能做些什么来创建一个x大小在主函数之外的矩阵呢?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2017-03-06 14:06:59

可变长度数组不是在标准c++中扩展的。而且你不想要全局定义。

在这种情况下,您可以使用的是std::vector

代码语言:javascript
运行
复制
void f(std::vector<std::vector<int>>& mat)
{

}

int main()
{
    cin >> x;
    std::vector<std::vector<int>> m(x,std::vector<int>(x));
    f(m);
}

如果将该向量传递给函数或在函数中分配,大小信息将随时保留。

我能做些什么来创建一个在主函数之外大小为x的矩阵?

就像这样:

代码语言:javascript
运行
复制
std::vector<std::vector<int>> foo() {
    cin >> x;
    std::vector<std::vector<int>> m(x,std::vector<int>(x));
    return m;
}

int main()
{
    std::vector<std::vector<int>> mat = foo();
}
票数 3
EN

Stack Overflow用户

发布于 2017-03-06 14:24:28

在C++中处理多维数组并不容易.最好的方法通常是用线性内存块映射多维索引。

例如,对于2×2矩阵,可以创建一个2*2=4元素数组,并以这样的方式映射它:

代码语言:javascript
运行
复制
+-----------+-----------+-----------+-----------+
| map[0][0] | map[0][1] | map[1][0] | map[1][1] |
+-----------+-----------+-----------+-----------+

乍一看,这似乎过于复杂,但它大大简化了内存分配。

对于width任意大小的height矩阵,map[i][j]位于索引i*height + j。这可以在C++中翻译,封装在模板类Matrix中。

代码语言:javascript
运行
复制
#include <array>
template <typename T, size_t WIDTH, size_t HEIGHT>
class Matrix {
    std::array<T, WIDTH*HEIGHT> data;

public:    
    T& operator()(size_t i, size_t j) {
        return data[i*HEIGHT + j];
    }
    const T& operator()(size_t i, size_t j) const {
        return data[i*HEIGHT + j];
    }
};

这有一个缺点,即Matrix的维度必须在编译时就知道(并且可以减轻,请参阅答案末尾的注意(ii) )。但它使它的使用变得如此容易:

代码语言:javascript
运行
复制
void fill(Matrix<int, 2, 2>& m) {
    m(0,0) = 0;
    m(0,1) = 1;
    m(1,0) = 2;
    m(1,1) = 3;
}

int main() {
    Matrix<int, 2, 2> m;
    fill(m);
    std::cout << m(1,0) << "\n";
}

注意(i):元素是由(line, column)而不是[line][column]索引的,因为我们不能创建接受多个值的operator[]

住在coliru

注(ii):这个基本思想是可以被丰富(演示)来处理可调整大小的矩阵,使用std::vector而不是std::arraystd::vector::resize()的代理。

票数 1
EN

Stack Overflow用户

发布于 2017-03-06 14:22:56

某些编译器支持可变长度数组作为扩展。编译器的手册提供了更多信息。Gnu VLR

变量长度数组的存储时间(如果支持的话)通常不能是静态的,这就是为什么您得到了错误消息(全局变量具有静态存储持续时间)。

无关:不需要参数mat2的主要数组界,即void f(int mat2[x][x])等效于void f(int mat2[][x])

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42627414

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档