• Status: Solved
• Priority: Medium
• Security: Public
• Views: 2690

# C++ jagged array (array of pointers)

I am attempting to create a jagged array in C++, which I believe is created using an array of pointers.  The goal is to create a jagged array to represent the 7 days of the week and expenditures for the day.  For example, if someone spends:

Sunday - \$7, \$17, \$23
Monday - 5, 10, 6, 8, 25
Tuesday - 13
Wednesday - 2, 7, 9, 11, 31, 7, 4
Thursday - 5, 6, 2, 18
Friday - 0
Saturday - 10, 22, 8

My C++ is a bit rusty, especially in the area of pointers.

I know that an array of 7 pointers (representing the 7 days of the week) can be written with

`````` int *weekArray[7]
``````

however I am unsure on how to implement those 7 pointers to be the integers I require.
0
Autkast
• 3
1 Solution

Commented:
You have implemented the pointers properly.
Now you need to create new arrays for each of the days, like this:
``````weekArray[0] = new int[3]; // expenditures for Sunday
weekArray[1] = new int[5]; // expenditures for Monday
etc.
``````
To access the values you will use the following code:
``````weekArray[0][0] = 7; weekArray[0][1] = 17; weekArray[0][2] = 23; // Sunday
weekArray[1][0] = 5; weekArray[1][1] = 10; etc. // Monday
``````
Do not forget to delete the pointers after you have finished with them:
``````delete [] weekArray[0];
delete [] weekArray[1];
etc.
``````
However...
You have tagged the question as a C++ question which automatically qualifies to a logical cross question: why pointers? When you deal with c++ you would use C++ features. First think that comes to mind is std::vector
the code will be as simple as this with the vector:
``````std::vector<int> weekArray[7];
weekArray[0][0] = 7; weekArray[0][1] = 17; weekArray[0][2] = 23; // Sunday
weekArray[1][0] = 5; weekArray[1][1] = 10; etc. // Monday
``````
Note, that in this case you do not need to manage memory with new/delete
0

Author Commented:
Ok, I like the vector idea, however I as I said, I am a bit rusty in C++.  When I declare the vector as you have shown,
``````
std::vector<int> weekArray[7];
//initialize weekArray
// sunday
weekArray[0][0] = 7;
weekArray[0][1] = 17;
weekArray[0][2] = 23;
// monday
weekArray[1][0] = 5;
weekArray[1][1] = 10;
weekArray[1][2] = 6;
weekArray[1][3] = 8;
weekArray[1][4] = 25;
// etc...
``````

I get that the vector subscript is out of range.

For a 2 dimensional vector, would it be declared as?:
``````	std::vector<vector<int>> weekArray;
``````

I also get a subscript out of range on this run as well.  I am not sure how to initialize a vector obviously.  If I do create the vector properly, are the same for-loops used when adding or averaging the elements in the vector as when adding/averaging multidimensional arrays?
0

Commented:
you insert elements to a vector using one of the following methods:
insert()
push_back()
I recommend you use the latter as it is easier.
Check this for reference.
0

Commented:
So, to convert it to your case the syntax will be:
``````std::vector<int> weekArray[7];
weekArray[0].push_back(7); weekArray[0].push_back(17); weekArray[0].push_back(23); // Sunday
weekArray[1].push_back(5); weekArray[1].push_back(10); etc. // Monday
``````
When you have inserted the values you could use operator[].
BTW, you are right about std::vector<vector<int>> weekArray;. However, I thought that because the number of days in a week is a constant value you could just use an array of vectors
You may consider creating a class for the weekDay, where the vector of expenditures is a member. Then you would just use a fixed number of these classes. By doing this you'd simplify the access to the elements of your weekDay class.
Consider this:
``````class WeekDay
{
public:
std::vector<int> expenditures;
}
enum
{
Sun,
Mon,
Tue,
Wed,
Thu,
Fri,
Sat
}
WeekDay week[7];
void main()
{
week[Mon].expenditures.push_back(1);
week[Sat].expenditures.push_back(2);
}
``````
If you need to add another property of the weekDay, you would just add another member inside the WeekDay class:
``````class WeekDay
{
public:
std::vector<int> expenditures;
bool iWeekEnd;
}
void main()
{
week[Mon].isWeekend=false;
week[Sat].isWeekend=true;
}
``````
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.