指针混乱导致 "no matching function call for std::vector"?

Pointer confusion causing "no matching function call for std::vector"?

我有一个 C++ class 有一个数据成员:

private:
    std::vector<std::vector<int>> *edges;

然后在我的构造函数中,我执行以下操作:

//rows and columns are dynamically set in constructor
edges = new vector<vector<int> >(rows*columns, vector<int>());
edges[0].push_back(1);

当运行我的程序,我得到

error: no matching function for call to std::vector<std::vector<int> >::push_back(int)
          edges[0].push_back(1); 
                              ^

我只知道这与 pointers/references 有关,但我没有足够的 C++ 经验来弄清楚这个错误消息感觉很模糊。有人知道这两行有什么问题吗?

EDIT1:我还尝试将数据成员更改为对象(不是指针)并执行此操作,但现在我的程序只是停滞不前

for (int i = 0; i < (rows*columns); i++) {
    vector<int> neighbors;
    edges.push_back(neighbors);
}

EDIT2:我也尝试过使用 paxdiablo 的答案,但现在这一行抛出了 bad_alloc

edges = new vector<vector<int> >(rows*columns, vector<int>());

这是加载二维向量的示例:

std::vector<std::vector<int>> board;
for (int row = 0; row < 4; ++row)
{
   std::vector<int> row;
   for (int column = 0; column < 4; ++column)
   {
       row.push_back((row * 4) + column);
   }
   board.push_back(row);
}

上面的代码初始化了一个 4x4 的二维数组,每个 slot/square.

都有一个唯一的数字

内部循环初始化一个“行”向量。
“行”向量初始化后,“push_back”到“板”向量

edges 是一个指针,所以 edges[0] 实际上是 outer 向量,您不能将整数附加到向量的向量中。

你需要的是:

(*edges)[0].push_back(1);

解引用给你外部向量,然后 [0] 给你第一个内部向量,你 可以 附加一个整数。

还有其他方法可以做到这一点,但这里的目的是简单地解释正在发生的事情。


具体来说,最好在 class 中声明 向量 而不是指向向量的指针。这样,您就可以在构建过程中自动获取它,而不必担心手动分配(或取消分配)它。

为此,您只需使用类似的东西:

#include <iostream>
#include <iomanip>
#include <vector>

struct IntMatrix
{
    IntMatrix(unsigned cols = 1U, unsigned rows = 1U)
    {
        // Disallow dimensions of size zero.

        rows = std::max(1U, rows);
        cols = std::max(1U, cols);

        // Construct each column vector and add to row vector.

        for (auto row = 0U; row < rows; ++row) {
            std::vector<int> new_row;
            for (auto col = 0U; col < cols; ++col) {
                new_row.push_back(0);
            }
            m_matrix.push_back(new_row);
        }
    }

    void set(unsigned col, unsigned row, int val) {
        // Set value, silently ignore invalid indexes.

        if (row < m_matrix.size() && col < m_matrix[0].size()) {
            m_matrix[row][col] = val;
        }
    }

    void print() {
        // Print out each column for each row.

        for (const auto &row: m_matrix) {
            for (const auto &val: row) {
                std::cout << std::setw(5) << val << ' ';
            }
            std::cout << '\n';
        }
    }

private:
    // No need for destructor, vectors deallocate themselves.

    std::vector<std::vector<int>> m_matrix;
};

// Test code, though a bit light on test cases :-)

int main() {
    IntMatrix fourBySeven(4U, 7U);
    fourBySeven.set(2U, 4U, 42);
    fourBySeven.print();
}

这个输出虽然很简单,但却是你所期望的:

    0     0     0     0 
    0     0     0     0 
    0     0     0     0 
    0     0     0     0 
    0     0    42     0 
    0     0     0     0 
    0     0     0     0