指针混乱导致 "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
我有一个 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