3
votes

I am trying to initialize a pointer (*vectorName) with a 2D vector 366 by 4.

Both

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

and

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

do not work and give me the error

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

What can I do?

This is happening within the main function.

3
@KonradRudolph That link doesn't seem to be directly related.Bernhard Barker
First, there seems to be no reason to use a pointer. Second, you do not have a pointer to a "multi-dimensional vector". You have a pointer to a vector<int>. That has one dimension.juanchopanza
Here is an example of a multidimensional vectorandre
@Dukeling It absolutely is (hint: it’s a presentation, use the left/right keys to navigate).Konrad Rudolph

3 Answers

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

The above doesn't work because the vector constructor template (ignoring a few things) looks as follows:

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

And in vector<int>(366, vector<int>(4)), vector <int> (4) is not of type int.

To create a vector with 366 elements that are vector of ints of size 4:

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

or, if you don't need a pointer: (which you quite possibly don't)

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

As a side note, if it's a fixed size 2D vector, why are you using vector, and not just an array. This would be much simpler:

int arr[366][4];
2
votes

I assume that you're trying to use a pointer to a vector in order to get a dynamic C-array of vectors. There's no reason to do that. You can use a vector of vectors instead:

vector< vector<int> >

You can initialize that like this:

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

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

Usage example:

vec[3][365] = 3;

If however you really do want a pointer to such a vector:

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;

If your size is constant and you're using a C++11 compiler, you can use an easier way, std::array:

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

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

Or a pointer to a dynamically allocated one:

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

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

Are you trying to do this? This makes a 2D vector of vectors with int. It creates 366 vectors with a vector with size 4,where all items are initialized to zero. Now you have a 2D vector of 366 by 4.

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

and if you would like a pointer to this vector:

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

if you would really need this.