2017-01-06 2 views
0

Как создать вектор NxM 2D int и создать для него значения по умолчанию?Как создать 2D-векторный массив со значениями по умолчанию?

Здесь я пытаюсь создать 3x3 Int вектор с некоторыми значениями:

vector< vector<int> > m(3, vector<int> (3)) = { 
    {1,2,9}, 
    {8,4,7}, 
    {5,6,0} 
    }; 

Но это ошибки с

> g++ a.cpp -std=c++11 

error: expected ‘,’ or ‘;’ before ‘=’ token 
    vector< vector<int> > m(3, vector<int> (3)) = { 
               ^
error: expected ‘}’ at end of input 
} 

Я использую C++ 11 и, таким образом, не должен выше синтаксис правильный? Согласно this answer, все должно быть в порядке?

+1

Голосование, закрытие в качестве опечатки. избавиться от вызова конструктора, поскольку список инициализаторов заменяет это. 'vector < vector> m = ...' – NathanOliver

ответ

1

Он отлично работает, если вы удалите то, что находится в круглых скобках. Размеры определяются размером списков инициализаторов. Если вы хотите указать размер самостоятельно, вы можете использовать std::array.

std::vector< std::vector<int> > m= { 
    {1,2,9}, 
    {8,4,7}, 
    {5,6,0} 
    }; 

Инициализация массивов немного отличается. См. this question. Вам нужны двойные фигурные скобки.

#include <array> 
std::array< std::array<int, 3>, 3 > m= {{ 
    {1,2,9}, 
    {8,4,7}, 
    {5,6,0} 
    }}; 
+0

В чем разница между использованием 'std :: array' и' std :: vector' при объявлении 2D-массива? Когда вы будете использовать один над другим? – vuvume

+0

@vuvume Размер 'std :: array' указан во время компиляции и не может измениться. Размер «std :: vector» может меняться во время выполнения. –

+0

Использует 'std :: array' то же самое, что и' int m [3] [3] '? – vuvume

0

Код в скобках дает аргументы в пользу vector «s конструктор:

vector<vector<int>>(3, vector<int>(3)); 

Это создает новый вектор, который содержит три элемента типа vector, и каждый из них имеет три целых числа внутри. Итак, no null s внутри вектора в этом случае.

Этот код:

vector<vector<int>> test = 
    { {3,4,5}, 
     {4,5,6} }; 

использует другой конструктор, который принимает список инициализатора и выводит размер результирующего вектора сам по себе.

Это разные конструкторы! Когда вы строите объект с обозначением Type object(arg1, arg2);, вы в основном вызываете конструктор Type. Вы вызываете функцию, и, конечно, вы не можете добавить вызов функции.

+0

Что делать, если я хочу инициализировать пустой массив 3x3? Как мне получить доступ к 'test [2] [2] == null'? – vuvume

+0

@vuvume: 'null' ?? Остановите случайное угадывание - программирование не работает именно так. Во всяком случае, нет такой вещи, как пустой массив 3x3; массив имеет либо элементы, либо нет. –

+0

@vuvume, я обновил свой ответ – ForceBru

Смежные вопросы