-
October 16th, 2012, 05:46 PM
#1
Which container to do what I need?
Sorry for this long post but I don't know how to explain it in a shorter form.
What container allows fast finding of a specific item -and- also allows scanning by using iterators that can be incremented in a "for" loop? My data:
Code:
Number of players: 4
BetInfo for each player:
---------------------------
Passline: betAmount, coordX, coordY
No Pass : betAmount, coordX, coordy
Field : betAmount, coordX, coordY
Place4 : betAmount, coordX, coordY
Place5 : betAmount, coordX, coordY
--- continues for about 50 different bets ---
QUESTION 1:
When dice is rolled, the diceSum dictates which bet amount I need to access. For instance, if the diceSum is a 2 on the first roll, the Passline bet loses for all 4 players so I need to access the Passline betAmount for each player to see of a bet was made (betAmount > 0). Then handle it.
(Player1 > Passline > betAmount), then
(Player2 > Passline > betAmount), then
(Player3 > Passline > betAmount), then
(Player4 > Passline > betAmount)
Which container will provide fast access to the betAmount for each player? Note that I have to do also do this for other bets like NoPass bets, Field bets, oneRoll2 bets, anyCrap bets, Horn bets and World bets to pay each player.
----------
QUESTION 2:
When a shooter 7's out, I need to pay some bets then zero all bets on the table for all 4 players. When I zero all bets on the table for 4 players, I would like to do it using iterators like in a "for" loop. So the container needs to be able to do this also. Which container can do #1 above and #2?
----------
Hope my explanation is clear enough. I think I need to use a 3 dimensional array to hold all of the BetInfo.
50 rows will be for each bet. (approximate)
3 columns will be for betAmount, coordX, coordY.
4 layers will be for the 4 players.
Code:
enum {Passline, NoPass, Field, Place4, Place5, ...etc.}; (bet-name)
enum {BetAmount, CoordX, CoordY}; (bet-data)
enum {Player1, Player2, Player3, Player4}; (player-number)
int betInfo[bet-name][bet-data][player-number]
But is there a better container to use to hold all of the betInfo, yet do what I need?
Thanks,
Raptor
Last edited by raptor88; October 16th, 2012 at 11:16 PM.
-
October 17th, 2012, 11:16 AM
#2
Re: Which container to do what I need?
almost all containers allow you to iterate over the items. So this is probably a moot requirement. What cannot always be guaranteed is specific ordering or indexed access.
"Fast finding" would mean you need a std::map or something like this.
If iterating (statistically over half the items) in the container is enough speed to qualify for "fast finding", then any container will do. and you can use the std::find() algorithm to do the searching.
-
October 17th, 2012, 02:45 PM
#3
Re: Which container to do what I need?
Originally Posted by OReubens
"Fast finding" would mean you need a std::map or something like this.
I can envision using a std::map for one player. In that case, the key could be the bet name like "Passline", "NoPass", "Field", etc. The mapped value could be a pointer to a struct which contains the "betAmount", "coordX" and "coordY" integer values.
How would I set up the map for 4 players where I can iterate through the 4 players in a loop?
Thanks,
Raptor (coding my first C++ program)
-
October 17th, 2012, 03:44 PM
#4
Re: Which container to do what I need?
Try forgetting that pointers exists when using STL containers. The containers are capable of handling new/delete for you so you neither have to worry about memory leaks nor invalid pointers. In this case declaring your map as
Code:
#include <map>
std::map< 'key', 'Some struct' > betInfo;
would probably meet what you need.
See http://cplusplus.com/reference/stl/map/
-
October 17th, 2012, 05:06 PM
#5
Re: Which container to do what I need?
Originally Posted by raptor88
The mapped value could be a pointer to a struct which contains the "betAmount", "coordX" and "coordY" integer values.
As S_M_A stated, you should be striving to use either value semantics (no pointers), or if pointers are needed, smart pointers.
Code:
#include <map>
#include <string>
#include <iostream>
struct SomeStruct
{
int x;
int y;
int z;
SomeStruct(int xVal=0, int yVal=0, int zVal=0) : x(xVal), y(yVal), z(zVal) {}
};
typedef std::map<std::string, SomeStruct> StringToStructMap;
using namespace std;
int main()
{
StringToStructMap sMap;
sMap.insert(make_pair("Joe", SomeStruct()));
sMap.insert(make_pair("Bob", SomeStruct(1,2,3)));
sMap.insert(make_pair("Sam", SomeStruct(4,5,6)));
StringToStructMap::iterator it = sMap.begin();
while (it != sMap.end() )
{
cout << it->first << " -> (" << it->second.x << "," << it->second.y << "," << it->second.z << ")\n";
++it;
}
}
There is no pointer usage in the code above.
Regards,
Paul McKenzie
Last edited by Paul McKenzie; October 18th, 2012 at 11:48 AM.
-
October 17th, 2012, 06:22 PM
#6
Re: Which container to do what I need?
Originally Posted by S_M_A
Try forgetting that pointers exists when using STL containers. The containers are capable of handling new/delete for you so you neither have to worry about memory leaks nor invalid pointers. In this case declaring your map as
Code:
#include <map>
std::map< 'key', 'Some struct' > betInfo;
would probably meet what you need.
See http://cplusplus.com/reference/stl/map/
Thanks much for your help,
Raptor
-
October 17th, 2012, 06:31 PM
#7
Re: Which container to do what I need?
Originally Posted by Paul McKenzie
As S_M_A stated, you should be striving to use either value semantics (no pointers), or if pointers are needed, smart pointers.
Code:
#include <map>
#include <string>
#include <iostream>
struct SomeStruct
{
int x;
int y;
int z;
SomeStruct(int xVal=0, int yVal=0, int zVal=0) : x(xVal), y(yVal), z(zVal) {}
};
typedef std::map<std::string, SomeStruct> StringToStructMap;
using namespace std;
int main()
{
StringToStructMap sMap;
sMap.insert(make_pair("Joe", SomeStruct()));
sMap.insert(make_pair("Bob", SomeStruct(1,2,3)));
sMap.insert(make_pair("Sam", SomeStruct(4,5,6)));
StringToStructMap::iterator it = sMap.begin();
while (it != sMap.end() )
{
cout << it->first << " -> (" << it->second.x << "," << it->second.y << "." << it->second.z << ")\n";
++it;
}
}
There is no pointer usage in the code above.
Regards,
Paul McKenzie
That is really helpful Paul. I'll try to figure out how to use that for 4 players. Maybe an array to hold the maps.
Thanks!
Raptor
-
October 18th, 2012, 05:30 AM
#8
Re: Which container to do what I need?
Originally Posted by Paul McKenzie
struct SomeStruct
{
int x;
int y;
int z;
SomeStruct(int xVal=0, int yVal=0, int zVal=0) : x(xVal), y(yVal), z(zVal) {}
};
typedef std::map<std::string, SomeStruct> StringToStructMap;
using namespace std;
int main()
{
StringToStructMap sMap;
sMap.insert(make_pair("Joe", SomeStruct()));
sMap.insert(make_pair("Bob", SomeStruct(1,2,3)));
sMap.insert(make_pair("Sam", SomeStruct(4,5,6)));
Hi Paul,
Going over your code, that's an extremely clever method of setting up the structure so it can be initialized in the format you show in main. I Googled for over 2 hours and could never find an explanation or even an example to match your method. Could I burden you to explain it to me (and other lurkers)?
How does this statement work?
Code:
SomeStruct(int xVal=0, int yVal=0, int zVal=0) : x(xVal), y(yVal), z(zVal) {}
1. Why does nesting SomeStruct (the same name) in SomeStruct make it work?
2. I learned that the single colon signifies the start of an initialization list. But why does x(xVal) work instead of x=xVal? IOW, how did you figure out to put the xVal in parenthesis?
3. How did you figure out that the {} is needed at the end of the statement without a semicolon';' ?
If you know of a link that explains it, please post it.
Your code is better than most books,
Raptor
-
October 18th, 2012, 07:15 AM
#9
Re: Which container to do what I need?
Paul's code is great, but you also aren't looking at the right books.
ahoodin
To keep the plot moving, that's why.
-
October 18th, 2012, 11:57 AM
#10
Re: Which container to do what I need?
Originally Posted by raptor88
How does this statement work?
Code:
SomeStruct(int xVal=0, int yVal=0, int zVal=0) : x(xVal), y(yVal), z(zVal) {}
1. Why does nesting SomeStruct (the same name) in SomeStruct make it work?
That is a constructor. Yes, even structs can have constructors.
2. I learned that the single colon signifies the start of an initialization list. But why does x(xVal) work instead of x=xVal? IOW, how did you figure out to put the xVal in parenthesis?
Since the call is a constructor, all you need to do is to look up how to write constructors that initialize member variables in the initialization list.
3. How did you figure out that the {} is needed at the end of the statement without a semicolon';' ?
The entire constructor function body is inlined into the struct. That is just an empty function block, no different than doing this:
Code:
SomeStruct(int xVal=0, int yVal=0, int zVal=0) : x(xVal), y(yVal), z(zVal)
{
// a do nothing constructor body
}
If you know of a link that explains it, please post it.
Well, as ahoodin pointed out, that "link" is a C++ book or good tutorial on the C++ language. Nothing that I wrote is out of the ordinary, i.e. every C++ vetaran that responds to you on this board will understand that code right away.
Regards,
Paul McKenzie
-
October 18th, 2012, 12:36 PM
#11
Re: Which container to do what I need?
Originally Posted by ahoodin
Paul's code is great, but you also aren't looking at the right books.
OK, am more than willing to buy another C++ book. Please tell me the name of a book that explains what Paul did with his constructor statement within a struct. None of my 6 or 7 C++ books nor hours of Googling even mention doing anything like that, let alone how to do it.
EDIT: No need for another book info. I understand Paul's code pretty well now.
Thanks,
Raptor
Last edited by raptor88; October 18th, 2012 at 01:59 PM.
-
October 18th, 2012, 12:54 PM
#12
Re: Which container to do what I need?
Originally Posted by Paul McKenzie
That is a constructor. Yes, even structs can have constructors.
Since the call is a constructor, all you need to do is to look up how to write constructors that initialize member variables in the initialization list.
The entire constructor function body is inlined into the struct. That is just an empty function block, no different than doing this:
Code:
SomeStruct(int xVal=0, int yVal=0, int zVal=0) : x(xVal), y(yVal), z(zVal)
{
// a do nothing constructor body
}
Well, as ahoodin pointed out, that "link" is a C++ book or good tutorial on the C++ language. Nothing that I wrote is out of the ordinary, i.e. every C++ vetaran that responds to you on this board will understand that code right away.
Regards,
Paul McKenzie
Hi Paul,
Thank you very much for taking the time to explain your code. Who would have guessed that even structs can have constructors. C++ books and web tutorials are so simplistic that they "all" cover the same "simple" ways of doing things. Not even over 2 hours of web searching even comes close to using or explaining code like yours. At least now your code and explanations are on the web and others Googling in the future might find it. Using your explanations, I think I can now continue research and figure out the rest.
EDIT: OK, now after reflecting on what you said, I realize now that the theory is that structs are like classes except they are always public. Looking at it in that light as a constructor function (same name as the "class" name, in this case the struct name) with an initialization list, it makes a lot more sense.
Thanks much!
Raptor
Last edited by raptor88; October 18th, 2012 at 01:07 PM.
-
October 18th, 2012, 01:27 PM
#13
Re: Which container to do what I need?
Originally Posted by raptor88
EDIT: OK, now after reflecting on what you said, I realize now that the theory is that structs are like classes except they are always public. Looking at it in that light as a constructor function (same name as the "class" name, in this case the struct name) with an initialization list, it makes a lot more sense.
No, the difference is that in structs the members are public by default but for classes the members are private by default. I.e. in this case:
Code:
struct SomeStruct
{
int x;
int y;
int z;
SomeStruct(int xVal=0, int yVal=0, int zVal=0) : x(xVal), y(yVal), z(zVal) {}
};
the members are all public, but in this case:
Code:
class SomeStruct
{
int x;
int y;
int z;
SomeStruct(int xVal=0, int yVal=0, int zVal=0) : x(xVal), y(yVal), z(zVal) {}
};
the members are all private (which obviously in this case would mean you couldn't make any instances of this class ). You can of course use public, private and protected access specifiers in either structs or classes to explicitly determine the access rights.
Incidentally, the first search result I get for "c++ constructor" in google is this: http://www.cplusplus.com/doc/tutorial/classes/ , which explains all this and more.
-
October 18th, 2012, 01:48 PM
#14
Re: Which container to do what I need?
Originally Posted by Peter_B
No, the difference is that in structs the members are public by default but for classes the members are private by default.
Yes, I did realize that but failed to say that "structs are like classes except they are always public by default". Thanks for clarifying it just in case I didn't realize it.
Yes, once one realizes that the statement is a constructor, searching becomes productive. My problem was that I had no clue it was a constructor being a wet behind the ears beginning C++ learner. I had realized that the statement was to allow initializing the struct later in the body, so all of my Googling had been for "C++ struct initialization" which turned up nothing like Paul's code.
I do appreciate your taking the time to help out ,
Raptor
-
October 18th, 2012, 01:55 PM
#15
Re: Which container to do what I need?
For other beginning C++ learners, here's a substitute for Paul's struct code. Tested and it works identically.
Code:
// The following code is equivalent to Paul's struct code and it works identically.
struct SomeStruct
{
int x;
int y;
int z;
SomeStruct(int xVal=0, int yVal=0, int zVal=0)
{
x = xVal;
y = yVal;
z = zVal;
}
};
Hope this helps other newbies like me with understanding his code,
Raptor
Posting Permissions
- You may not post new threads
- You may not post replies
- You may not post attachments
- You may not edit your posts
-
Forum Rules
|
Click Here to Expand Forum to Full Width
|