Как сделать конструктор для 2D вектора в C ++? - PullRequest
2 голосов
/ 27 апреля 2019

Я пытался инициализировать 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 ]

3 голосов
/ 27 апреля 2019

Ваш код имеет две проблемы:

  1. В следующей строке вы должны иметь , предоставив параметры для построение Node, которые to и legth.

    vector<vector<Node>>(n, vector<Node>(n,0x3fffffff));
    //                                   ^^^^^^^^^^^--> here
    
  2. В Graph элемент n не инициализирован на точка, вы вызываете конструктор по умолчанию. Это привело бы вас к значение мусора в n и, следовательно, размер nodes_list будет быть неопределенным.

Фиксированный код будет выглядеть так:

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)'
    {}
};

Также некоторые предложения:

  1. Использовать инициализатор члена списки инициализировать вектор вместо создания и присвоения ему.
  2. Не стоит называть как параметры конструктора, так и члены с таким же Node. В какой-то момент это может привести к неурядицы.
3 голосов
/ 27 апреля 2019
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, не делайте этого, это вызовет проблемы в какой-то момент.

...