2013-02-19 2 views
2

Я пытаюсь инициализировать указатель (*vectorName) с 2D вектора 366 на 4.Указатель на многомерный вектор

Оба

vector<int> *vectorName = new vector<int>(366, new vector<int>(4)); 

и

vector<int> *vectorName = new vector<int>(366, vector<int>(4)); 

не работают и сообщите мне об ошибке

Error: no instance of constructor "std::vector, <_Ty, _Alloc>::vector [with_ty=int, _Alloc=std_allocator]" argument types are (const int, std::vector>*)

Что мне делать?

Это происходит в пределах основной функции.

+3

[Не использовать указатели] (http://klmr.me/slides/modern-cpp) –

+0

@KonradRudolph Эта ссылка не связана напрямую. – Dukeling

+0

Во-первых, кажется, нет причин использовать указатель. Во-вторых, у вас нет указателя на «многомерный вектор». У вас есть указатель на 'vector '. Это одно измерение. – juanchopanza

ответ

3
vector<int> *vectorName = new vector<int>(366, vector<int>(4)); 

выше не работает, потому что vector constructor шаблон (игнорируя несколько вещей) выглядит следующим образом:

vector <TYPE> (SIZE, variable of type TYPE); 

И в vector<int>(366, vector<int>(4)), vector <int> (4) не типа int.

Чтобы создать vector с 366 элементами, которые vector из int с размером 4:

vector<vector<int> > *vectorName = new vector<vector<int> >(366, vector<int>(4)); 

или , если вам не нужен указатель: (который вы, вполне возможно, не» т)

vector<vector<int> > vectorName(366, vector<int>(4)); 

в качестве примечания, если это фиксированный размер 2D vector, почему вы используете vector, а не только массив. Это было бы гораздо проще:

int arr[366][4]; 
+0

Спасибо, это очень помогает. Я все еще новичок в 2D и 3D векторах. – kclausch

1

Я предполагаю, что вы пытаетесь использовать указатель на вектор, чтобы получить динамический C-массив векторов. Нет причин для этого. Вы можете использовать вектор векторов вместо:

vector< vector<int> > 

Вы можете инициализировать, что, как это:

vector< vector<int> > vec(4); 

for (size_t i = 0; i < 4; ++i) { 
    vec[i].resize(366); 
} 

Пример использования:

vec[3][365] = 3; 

Однако, если вы действительно хотите указатель на такие вектор:

vector< vector<int> >* vec = new vector< vector<int> >(4); 

for (size_t i = 0; i < 4; ++i) { 
    (*vec)[i].resize(366); 
} 

(*vec)[3][365] = 3; 

Если ваш размер является постоянным, и вы используете C++ 11 компилятора, вы можете использовать более простой способ, std::array:

array<array<int, 366>, 4> arr; 

// Usage example 
arr[3][365] = 3; 

Или указатель на динамически выделяется один:

array<array<int, 366>, 4>* arr = new array<array<int, 366>, 4>; 

// Usage example 
(*arr)[3][365] = 3; 
0

Вы пытаетесь это сделать?Это делает 2D-вектор векторов с int. Он создает 366 векторов с вектором размером 4, где все элементы инициализируются до нуля. Теперь у вас есть 2D вектор 366 на 4.

vector<vector<int> > twod(366, vector<int>(4,0)); 

и если вы хотите получить указатель на этот вектор:

vector<vector<int> >* twodptr = &twod; 

, если вам действительно нужно будет это.

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