Solved

C++ jagged array (array of pointers)

Posted on 2013-11-10
4
1,872 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
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 3
4 Comments
 
LVL 25

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 25

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 25

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

[Webinar] How Hackers Steal Your Credentials

Do You Know How Hackers Steal Your Credentials? Join us and Skyport Systems to learn how hackers steal your credentials and why Active Directory must be secure to stop them. Thursday, July 13, 2017 10:00 A.M. PDT

Question has a verified solution.

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

Article by: SunnyDark
This article's goal is to present you with an easy to use XML wrapper for C++ and also present some interesting techniques that you might use with MS C++. The reason I built this class is to ease the pain of using XML files with C++, since there is…
IntroductionThis article is the second in a three part article series on the Visual Studio 2008 Debugger.  It provides tips in setting and using breakpoints. If not familiar with this debugger, you can find a basic introduction in the EE article loc…
The goal of the video will be to teach the user the difference and consequence of passing data by value vs passing data by reference in C++. An example of passing data by value as well as an example of passing data by reference will be be given. Bot…
The viewer will learn how to clear a vector as well as how to detect empty vectors in C++.

729 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