Re: Sorting data and creating multiple instances of the same class.
Daz wrote:
Hello people!
(This post is best viewed using a monospace font).
I need to create a class, which holds 4 elements:
std::string ItemName
int Calories
int Weight
int Density
I need to be able to create about 70 instances of this class, each with
different properties, then I need to sort them three times:
First, by calories. Then do some stuff.
Then by Weight. Then do more stuff.
And finally by Density. After which, I do more stuff.
It was suggested to me yesterday that I should use std::map in order to
sort the data, but I can't see how it would work.
std::map is mostly useful if you have to sort by only one item. For your
case, I'd suggest std::vector in combination with std::sort and one
comparison function object for each element you want to sort by.
For example:
C W D <--(Pure coincidence)
"Fries"------10---159--45-
"Berry"------50---99---65-
"Ice Cream"--90---45---87-
"Hamburger"--4----76---23-
If sorted by Weight (W) should yield:
C W D
"Ice Cream"--90---45---87-
"Berry"------50---99---65-
"Hamburger"--4----76---23-
"Fries"------10---159--45-
I need to sort it by Density and Calories at some point too, yet the
rows need to stay intact.
No, my program isn't really _that_ lame, but that is the one of it's
simplest functions.
If I really can use a std::map, How would I go about doing it? I know I
am missing something really obvious here, but I have spent more hours
than anyone should pondering over this seemingly simple question, and
have not stumbled across any answers.
My next question, is:
Is there any easy way to create 70 instances of my class dynamically,
and iterate through them?
By this I mean, do I have to do:
BBObject Obj1("Berry",50,99,65);
BBObject Obj2("Fries",10,159,45);
BBObject Obj3("Hamburger",4,76,23);
...For 70 objects?
Again, use std::vector, like:
std::vector<BBOject> objects;
objects.push_back(BBObject("Berry",50,99,65));
objects.push_back(BBObject("Fries",10,159,45));
objects.push_back(BBObject("Hamburger",4,76,23));
If so, then fair enough. However, if I can do this in a better way, and
somehow make a list so that I can iterate through the object, it would
be fantastic.
You can iterate through the vector with something like:
typedef std::vecctor<BBOject>::iterator iterator;
for (iterator it = objects.begin(), end = objects.end(); it != end; ++it)
{
std::cout << *it.ItemName;
}
The only catch is, that the list order will need to change as I do the
sorting.
Look for the std::sort function template, and especially for its third
argument. It can be used to specify a comparison function that will be used
as basis for the sorting.
N.B. I do not want the code created for me. I am desparately trying to
learn what I can and can't do, along with how to do it.
That's good. I hope I gave you neither too much nor too few information.