【问题标题】:How do I init an array with non fixed length in a C++ class?如何在 C++ 类中初始化具有非固定长度的数组?
【发布时间】:2021-08-23 18:57:07
【问题描述】:

我刚刚开始使用 C++,我试图在一个类中初始化一个数组,其长度取决于“s”参数。有人能告诉我最简单的方法吗?

#include<iostream>
using namespace std;

class Game{
    public:
        int size;
        int grid[size][size]; // This is where the error occurs.
        Game(int s){
            size = s;
        }

};

int main(){
    Game g(10);
    return 0;
}

【问题讨论】:

  • 你说“非固定”的那一刻,等同于动态容器。最常见的是std::vector。在你的情况下,std::vector&lt;std::vector&lt;int&gt;&gt; grid; 可能会做你想做的事,由Game(int s) : grid(s, std::vector&lt;int&gt;(s)) {} 初始化
  • 请注意std::vector&lt;std::vector&lt;int&gt;&gt; 不是一个“二维数组”,而是一个分散的数组数组。它非常效率低下,并且它本身不维护基本不变量(例如“所有行具有相同的列数”)。一个合适的解决方案是创建一个简单的二维数组类。
  • 没有办法“在 C++ 中初始化一个非固定长度的数组”,原因很简单,因为没有“C++ 中的非固定长度数组”之类的东西。 C++ 不能以这种方式工作。
  • 对,在c++中,当你需要一个在编译时不知道大小的数组时,你一般使用std:vector,二维网格不一定需要嵌套它们,你会发现很多类似问题的答案在这里。在c++中initdeclaredefine意思不同,我的建议是在养成坏习惯之前先在好书上学习基础知识
  • 我同意@spectras:std::vector 之上的包装类是最可行的解决方案。但请注意,所有 N 维数组实际上都由 RAM 支持,这基本上是一个大的 1D 数组,因此调整任意大小的 N 维会产生重新分配存储和移动元素到新的开销布局。在方形/立方体/超立方体数组的情况下,可以通过将每个新行/列完全放入后备向量的尾部来大大优化。

标签: c++ arrays class


【解决方案1】:

使用std::vector,并考虑将 2D 映射到 1D。

#include <cstddef>
#include <iostream>
#include <vector>
#include <cassert>

using std::cout;
using std::ostream;
using std::size_t;
using std::vector;

class Game {
    size_t size;
    vector<int> grid; // vector will be size * size big.
public:
    Game(size_t s) : size{s}, grid(s * s, 0) { }

    auto operator()(size_t x, size_t y) const -> int {
        assert(x < size);
        assert(y < size);
        auto i = x + y * size;
        return grid[i];
    }

    auto operator()(size_t x, size_t y) -> int& {
        assert(x < size);
        assert(y < size);
        auto i = x + y * size;
        return grid[i];
    }

    void print(ostream&) const;
};

void Game::print(ostream& out) const {
    auto end = size * size;
    auto sep = "";

    for (size_t i = 0; i < end; ++i) {
        out << sep << grid[i];
        sep = ((i + 1) % size == 0) ? "\n" : " ";
    }

    out << "\n";
}

int main() {
    Game g(10);
    g(0, 3) = 9;
    g(5, 5) = 5;
    g.print(cout);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-12
    • 2014-04-02
    • 2011-06-18
    • 1970-01-01
    • 2020-04-17
    相关资源
    最近更新 更多