4

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.

David G
  • 94,763
  • 41
  • 167
  • 253
kclausch
  • 43
  • 1
  • 1
  • 3

3 Answers3

4
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];
Bernhard Barker
  • 54,589
  • 14
  • 104
  • 138
3

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;
Nikos C.
  • 50,738
  • 9
  • 71
  • 96
0

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.

hetepeperfan
  • 4,292
  • 1
  • 29
  • 47