Solved

C++ jagged array (array of pointers)

Posted on 2013-11-10
4
1,665 Views
Last Modified: 2013-11-10
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] 

Open in new window


however I am unsure on how to implement those 7 pointers to be the integers I require.
0
Comment
Question by:Autkast
  • 3
4 Comments
 
LVL 24

Expert Comment

by:chaau
ID: 39637696
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.

Open in new window

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

Open in new window

Do not forget to delete the pointers after you have finished with them:
delete [] weekArray[0];
delete [] weekArray[1];
etc.

Open in new window

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

Open in new window

Note, that in this case you do not need to manage memory with new/delete
0
 

Author Comment

by:Autkast
ID: 39637763
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...

Open in new window


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;

Open in new window


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
 
LVL 24

Expert Comment

by:chaau
ID: 39637769
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
 
LVL 24

Accepted Solution

by:
chaau earned 100 total points
ID: 39637781
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

Open in new window

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);
}

Open in new window

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;
}

Open in new window

0

Featured Post

Master Your Team's Linux and Cloud Stack!

The average business loses $13.5M per year to ineffective training (per 1,000 employees). Keep ahead of the competition and combine in-person quality with online cost and flexibility by training with Linux Academy.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Often, when implementing a feature, you won't know how certain events should be handled at the point where they occur and you'd rather defer to the user of your function or class. For example, a XML parser will extract a tag from the source code, wh…
Introduction This article is a continuation of the C/C++ Visual Studio Express debugger series. Part 1 provided a quick start guide in using the debugger. Part 2 focused on additional topics in breakpoints. As your assignments become a little more …
The goal of the tutorial is to teach the user how to use functions in C++. The video will cover how to define functions, how to call functions and how to create functions prototypes. Microsoft Visual C++ 2010 Express will be used as a text editor an…
The goal of the video will be to teach the user the concept of local variables and scope. An example of a locally defined variable will be given as well as an explanation of what scope is in C++. The local variable and concept of scope will be relat…

777 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question