如何在C ++中为2D向量构造函数?

时间:2019-04-27 06:08:01

标签: c++ c++11 multidimensional-array constructor stdvector

我尝试通过3种不同的方式用构造函数初始化2D向量,但总是得到

"error: no matching function to call"

你能告诉我我哪里错了吗?

class Node 
{
public:
  int to;
  int length;
  Node(int to, int length) : to(to), length(length){}
};

class Graph 
{
public:
  vector<vector<Node>> nodes_list;
  int n;
  Graph();
};

Graph::Graph(){
  nodes_list = vector<vector<Node> >(n, vector<Node>(n,0x3fffffff));
}

2 个答案:

答案 0 :(得分:3)

vector<Node>(n,0x3fffffff);

(大致)等同于:

vector<Node> v;
for ( size_t i = 0; i < n; i++ )
{
   v.push_back(Node(0x3fffffff));
}

由于您的Node类没有带单个整数的构造函数,因此无法编译。正确的代码是:

vector<Node>(n,Node(0x3fffffff,0));

按照我假设您在using namespace std;的标头中包含Graph的方式,请不要这样做,这会在某些时候导致问题。

答案 1 :(得分:2)

您的代码有两个问题:

  1. 在以下行中,您应该提供了用于 构造Nodeto的{​​{1}}

    legth
  2. vector<vector<Node>>(n, vector<Node>(n,0x3fffffff)); // ^^^^^^^^^^^--> here 中,成员 Graph尚未初始化,位于 指向默认构造函数。那会导致你有 n中的垃圾值,因此n的大小将 不确定。

固定代码如下:

nodes_list

还有一些建议:

  1. 使用 member initializer lists 初始化向量,而不是创建并分配给它。
  2. 同时命名构造函数参数和 struct Node { int _to; int _length; Node(int to, int length) : _to{ to }, _length{ length } {} }; class Graph { using VecNode = std::vector<Node>; // type alias for convenience private: int _n; std::vector<VecNode> _nodes_list; public: Graph() : _n{ 2 } // initialize _n , _nodes_list{ _n, VecNode(_n, { 1, 3 }) } // ^^^^^^-> initialize with the default 'Node(1, 3)' {} }; 中具有相同成员的成员。在某些时候,这可能会导致 混乱。