cpp 使用向量编译错误初始化二维数组

Posted

技术标签:

【中文标题】cpp 使用向量编译错误初始化二维数组【英文标题】:cpp initialize 2-D array using vectors compilation error 【发布时间】:2014-06-17 10:44:06 【问题描述】:

我想使用构造函数中的初始化列表来初始化二维数组 m_field。 就像在这个线程 Creating 2-dimensional vector in class C++ 中一样,但我收到下面列出的错误。

BoardData.h

#ifndef BOARDDATA_H
#define BOARDDATA_H

#include <vector>

class BoardData

    public:
    /** Default constructor */
    BoardData(int rows, int cols);
    /** Default destructor */
    virtual ~BoardData();
    protected:
    private:
    std::vector< std:vector<int> > m_field;

;


#endif // BOARDDATA_H

BoardData.cpp

#include "BoardData.h"

BoardData::BoardData(int rows, int cols) :
                     m_field(rows, std::vector<int>(cols,0))

    //ctor


BoardData::~BoardData()

    //dtor

编译器输出:(gcc 版本 4.6.3)

BoardData.h|18|error: template argument 1 is invalid|
BoardData.h|18|error: template argument 2 is invalid|
BoardData.cpp||In constructor ‘BoardData::BoardData(int, int)’:|
BoardData.cpp|4|error: expression list treated as compound expression in mem-initializer [-fpermissive]|
BoardData.cpp|4|warning: left operand of comma operator has no effect [-Wunused-value]|
BoardData.cpp|4|error: cannot convert ‘std::vector<int>’ to ‘int’ in initialization|
||=== Build finished: 4 errors, 1 warnings ===|

【问题讨论】:

提示:是Coordinate,不是Coordination,缩写coordcoords复数. 另外m_row在这里完全是多余的。回到书上! (因为那个SO问题也是初学者写的。不懂的代码不要抄)。 @BartekBanachewicz 将 Q 编辑到我之前没有 m_row 的迭代中。 没有所谓的“默认析构函数”。它只是一个析构函数,你不用评论来解释它。 您在 m_field 的声明中缺少双列 【参考方案1】:
std::vector< std:vector<int> > m_field;

应该是

std::vector< std::vector<int> > m_field;
                 ^

这不是一个很有帮助的错误消息,我同意...

【讨论】:

【参考方案2】:

您应该调整您的设计,而不是修复此编译错误。矩形数组通常不应存储为向量的向量,而应存储为您将以 2D 方式索引的单个向量。您可以为此使用现有的库,如 Boost.Matrix,或自己实现它:

m_field(rows*cols) // initialize
m_field[row + rows*col] // index

为了安全起见,您可以提供自己的方法来按行和列进行索引。这最终将比向量的向量方法更有效。

【讨论】:

我没有要求优化。我明确地问我为什么会出现编译错误。 我不太同意破解一维数组普遍“更好”的建议。如果您的代码简单明了并且满足您的性能要求,那很好。根据我的经验,清晰度胜过不必要的优化。 @MattMcNabb:我基本同意你的观点,但请考虑向量向量表示锯齿状二维数组,而不是矩形数组。从概念上讲,在单个分配中执行 2D 索引更简洁(而且开销要少得多)。

以上是关于cpp 使用向量编译错误初始化二维数组的主要内容,如果未能解决你的问题,请参考以下文章

将二维向量转换为二维数组

使用 NULL 数组将内存分配给二维数组 (c)

为啥多维数组第一维的大小可以是任意的

C中结构体内有一个成员是二维数组,可以直接赋值另一个一维数组吗?

如何实现二维向量数组?

Numpy - 从数组中切片二维行或列向量