инициализировать 2d вектор в с ++ - PullRequest
0 голосов
/ 02 октября 2018

Итак, у меня есть следующий код на c ++:

Это 2-й вектор:

vector<vector<int>> adj;

Инициализация 2-го вектора:

adj[0].push_back(1);
adj[0].push_back(2);
adj[1].push_back(3);
adj[1].push_back(4);
adj[1].push_back(5);

Печатьvector:

for(auto i : adj) {
    for(auto j : i)
        cout << j << " ";
    cout << endl;
}

Компиляция без ошибок, но при попытке запустить ничего не показывает.Как это исправить?

Ответы [ 3 ]

0 голосов
/ 02 октября 2018

std :: vector operator [] ожидает существование элемента.Это приведет к неопределенному поведению при доступе к неопределенному элементу.Вставьте std :: vector во внешний вектор, прежде чем нажать int во внутренний вектор.Член at () может использоваться для безопасного доступа к любому индексу массива с обработкой ошибок.

#include <vector>
#include <iostream>


int main()
{
   std::vector<std::vector<int>> adj(2); // add two std::vector<int>


   adj[0].push_back(1);
   adj[0].push_back(2);
   adj[1].push_back(3);
   adj[1].push_back(4);
   adj[1].push_back(5);

   for(auto const & i : adj) {
       for(auto const & j : i)
          std::cout << j << " ";
       std::cout << std::endl;
   }
}
0 голосов
/ 02 октября 2018

Вы можете инициализировать размер вектора, вызывая его конструктор:

vector< vector<int> > adj(row_size, vector<int>(col_size));
                             ^^^      ^^^^^^^        ^^^
                     Dimension 1    Element Ctor     Dimension 2

Затем вы можете индексировать его как массив.

0 голосов
/ 02 октября 2018

Когда вы пишете adj[0], вы неявно предполагаете, что вектор имеет размер по крайней мере 1, чтобы существовал нулевой элемент.Это не относится к пустому вектору, например, недавно инициализированному.К сожалению, это не гарантирует какую-либо ошибку, это неопределенное поведение, и компилятор может позволить буквально что-нибудь случиться.Чтобы избежать этого, вам нужно освободить место для этих элементов, что можно сделать несколькими способами:

adj.resize(2); // now size == 2, and [0] and [1] can be safely accessed
adj[0].push_back(1);
adj[1].push_back(3);

или, альтернативно,

adj.push_back({}); // append default-constructed vector
adj.back().push_back(1); // append 1 to the above vector

или, возможно, наиболее кратко:

adj = {
    {1, 2},
    {3, 4, 5}
};
// adj now contains two vectors containing {1, 2} and {3, 4, 5} respectively

Если вы хотите использовать индексный оператор [] для индексированного доступа к вектору, рассмотрите возможность использования vector.at(), который выполняет те же функции, но выдает исключение, если индексвне диапазона.Это может быть очень полезно для отладки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...