STL sort with user defined data type

M

mweltin

I have been looking in the archives and as of yet have not found an
answer to my problem.
Class B has four members, and class A is derived from class B. Class
A only adds one new member to class B.
Class A has '<', '>', '==' and '=' overloaded, as well as a copy
constructor. Class B only has the copy constructor and assignment
operator overloaded.

I create a vector of A objects, and stuff them with random values.
When I sort the vector of A objects only the member unique to the A
object changes.

For example say I have three A objects in a vector blah

blah[0] {one = 5 two = 0.8 three = 0.1 mysortvar = 1}
blah[1] {one = 2 two = 0.7 three = 0.2 mysortvar = 0}
blah[2] {one = 7 two = 0.6 three = 0.3 mysortvar = 3 }

I expect
blah[0] {one = 2 two = 0.7 three = 0.2 mysortvar = 0}
blah[1] {one = 5 two = 0.8 three = 0.1 mysortvar = 1}
blah[2] {one = 7 two = 0.6 three = 0.3 mysortvar = 3 }

but I get

blah[0] {one = 5 two = 0.8 three = 0.1 mysortvar = 0}
blah[1] {one = 2 two = 0.7 three = 0.2 mysortvar = 1}
blah[2] {one = 7 two = 0.6 three = 0.3 mysortvar = 3 }

Note:ONLY THE mysortvar values change.

could someone clue me into what I'm doing wrong?
thank you,
Markus
 
K

Kai-Uwe Bux

I have been looking in the archives and as of yet have not found an
answer to my problem.
Class B has four members, and class A is derived from class B. Class
A only adds one new member to class B.
Class A has '<', '>', '==' and '=' overloaded, as well as a copy
constructor. Class B only has the copy constructor and assignment
operator overloaded.

I create a vector of A objects, and stuff them with random values.
When I sort the vector of A objects only the member unique to the A
object changes.

For example say I have three A objects in a vector blah

blah[0] {one = 5 two = 0.8 three = 0.1 mysortvar = 1}
blah[1] {one = 2 two = 0.7 three = 0.2 mysortvar = 0}
blah[2] {one = 7 two = 0.6 three = 0.3 mysortvar = 3 }

I expect
blah[0] {one = 2 two = 0.7 three = 0.2 mysortvar = 0}
blah[1] {one = 5 two = 0.8 three = 0.1 mysortvar = 1}
blah[2] {one = 7 two = 0.6 three = 0.3 mysortvar = 3 }

but I get

blah[0] {one = 5 two = 0.8 three = 0.1 mysortvar = 0}
blah[1] {one = 2 two = 0.7 three = 0.2 mysortvar = 1}
blah[2] {one = 7 two = 0.6 three = 0.3 mysortvar = 3 }

Note:ONLY THE mysortvar values change.

could someone clue me into what I'm doing wrong?

Post at least the copy-constructors and assignment operators. My guess is
that at least one of them (for class A) does not forward the call to the
B-subobject. If I had to bet, I would venture the conjecture that the first
line is missing in A::eek:perator=:

A & operator= ( A const & other ) {
B::eek:perator=( other ); // assign the B subobject
mysortvar = other.mysortvar; // assign the additional member
return ( *this );
}


Best

Kai-Uwe Bux
 
M

mweltin

I have been looking in the archives and as of yet have not found an
answer to my problem.
Class B has four members, and class A is derived from class B. Class
A only adds one new member to class B.
Class A has '<', '>', '==' and '=' overloaded, as well as a copy
constructor. Class B only has the copy constructor and assignment
operator overloaded.
I create a vector of A objects, and stuff them with random values.
When I sort the vector of A objects only the member unique to the A
object changes.
For example say I have three A objects in a vector blah
blah[0] {one = 5 two = 0.8 three = 0.1 mysortvar = 1}
blah[1] {one = 2 two = 0.7 three = 0.2 mysortvar = 0}
blah[2] {one = 7 two = 0.6 three = 0.3 mysortvar = 3 }
I expect
blah[0] {one = 2 two = 0.7 three = 0.2 mysortvar = 0}
blah[1] {one = 5 two = 0.8 three = 0.1 mysortvar = 1}
blah[2] {one = 7 two = 0.6 three = 0.3 mysortvar = 3 }
but I get
blah[0] {one = 5 two = 0.8 three = 0.1 mysortvar = 0}
blah[1] {one = 2 two = 0.7 three = 0.2 mysortvar = 1}
blah[2] {one = 7 two = 0.6 three = 0.3 mysortvar = 3 }
Note:ONLY THE mysortvar values change.
could someone clue me into what I'm doing wrong?

Post at least the copy-constructors and assignment operators. My guess is
that at least one of them (for class A) does not forward the call to the
B-subobject. If I had to bet, I would venture the conjecture that the first
line is missing in A::eek:perator=:

A & operator= ( A const & other ) {
B::eek:perator=( other ); // assign the B subobject
mysortvar = other.mysortvar; // assign the additional member
return ( *this );
}

Best

Kai-Uwe Bux
I'm in American Samoa and my internet connection is not what you would
call good, or even bad, its worse than bad. I'm having trouble
posting to this list so please forgive me if I reply more than once.
You are correct. To let you in on some more detail it is for a
genetic algorithm.
The base class is a "genome" and the derived class is an "individual.
Their overloaded assignment operators are posted below. As you can
see in the old version of the individual class assignment operator I
was copying all the members explicitly, and not using the base class
assignment operator. I'm not sure how these differ. I ran a test
with the newly suggested assignment operator and it works. Clearly,
there is something about the "sort", or other aspect of the STL I have
no idea about. If you have the time and would care to enlighten me I
would be grateful.

NNGenome & NNGenome::eek:perator=(const NNGenome & oldNNG){
if(this != &oldNNG){ //Check for self assignment.
this->Epochs = oldNNG.Epochs;
this->LearnRate = oldNNG.LearnRate;
this->Momentum = oldNNG.Momentum;
this->NNStrDef = oldNNG.NNStrDef;
}
return *this;
}

Individual & Individual::eek:perator=(const Individual& GNN){
//check for self assigement.
if(this != &GNN){
this->BestFitness = GNN.BestFitness;
this->Gepochs = GNN.Gepochs;
this->GlearnRate = GNN.GlearnRate;
this->Gmomentum = GNN.Gmomentum;
this->GnnStrDef = GNN.GnnStrDef;
}
return *this;
}
I switched the above to the following.
Individual & Individual::eek:perator=(const Individual& GNN){
//check for self assigement.
if(this != &GNN){
NNGenome::eek:perator=(GNN);
this->BestFitness = GNN.BestFitness;
}
return *this;
}
 
K

Kai-Uwe Bux

I have been looking in the archives and as of yet have not found an
answer to my problem.
Class B has four members, and class A is derived from class B. Class
A only adds one new member to class B.
Class A has '<', '>', '==' and '=' overloaded, as well as a copy
constructor. Class B only has the copy constructor and assignment
operator overloaded.
I create a vector of A objects, and stuff them with random values.
When I sort the vector of A objects only the member unique to the A
object changes.
For example say I have three A objects in a vector blah
blah[0] {one = 5 two = 0.8 three = 0.1 mysortvar = 1}
blah[1] {one = 2 two = 0.7 three = 0.2 mysortvar = 0}
blah[2] {one = 7 two = 0.6 three = 0.3 mysortvar = 3 }
I expect
blah[0] {one = 2 two = 0.7 three = 0.2 mysortvar = 0}
blah[1] {one = 5 two = 0.8 three = 0.1 mysortvar = 1}
blah[2] {one = 7 two = 0.6 three = 0.3 mysortvar = 3 }
but I get
blah[0] {one = 5 two = 0.8 three = 0.1 mysortvar = 0}
blah[1] {one = 2 two = 0.7 three = 0.2 mysortvar = 1}
blah[2] {one = 7 two = 0.6 three = 0.3 mysortvar = 3 }
Note:ONLY THE mysortvar values change.
could someone clue me into what I'm doing wrong?

Post at least the copy-constructors and assignment operators. My guess is
that at least one of them (for class A) does not forward the call to the
B-subobject. If I had to bet, I would venture the conjecture that the
first line is missing in A::eek:perator=:

A & operator= ( A const & other ) {
B::eek:perator=( other ); // assign the B subobject
mysortvar = other.mysortvar; // assign the additional member
return ( *this );
}

Best

Kai-Uwe Bux
I'm in American Samoa and my internet connection is not what you would
call good, or even bad, its worse than bad. I'm having trouble
posting to this list so please forgive me if I reply more than once.
You are correct. To let you in on some more detail it is for a
genetic algorithm.
The base class is a "genome" and the derived class is an "individual.
Their overloaded assignment operators are posted below. As you can
see in the old version of the individual class assignment operator I
was copying all the members explicitly, and not using the base class
assignment operator. I'm not sure how these differ. I ran a test
with the newly suggested assignment operator and it works. Clearly,
there is something about the "sort", or other aspect of the STL I have
no idea about. If you have the time and would care to enlighten me I
would be grateful.

NNGenome & NNGenome::eek:perator=(const NNGenome & oldNNG){
if(this != &oldNNG){ //Check for self assignment.
this->Epochs = oldNNG.Epochs;
this->LearnRate = oldNNG.LearnRate;
this->Momentum = oldNNG.Momentum;
this->NNStrDef = oldNNG.NNStrDef;
}
return *this;
}

Individual & Individual::eek:perator=(const Individual& GNN){
//check for self assigement.
if(this != &GNN){
this->BestFitness = GNN.BestFitness;
this->Gepochs = GNN.Gepochs;
this->GlearnRate = GNN.GlearnRate;
this->Gmomentum = GNN.Gmomentum;
this->GnnStrDef = GNN.GnnStrDef;
}
return *this;
}

Well, I note that the base class assignment mentioness the members

Epochs
LearnRate
Momentum
NNStrDef

whereas the assignment operator for the derived class is working on

BestFitness // new member
Gepochs // ?
GlearnRate // ?
Gmomentum // ?
GnnStrDef // ?

Without seeing more code, it is hard to be certain, but the mismatch in
identifiers could indicate that the copying of the base-class member is not
handled correctly (which matches the output).
I switched the above to the following.
Individual & Individual::eek:perator=(const Individual& GNN){
//check for self assigement.
if(this != &GNN){
NNGenome::eek:perator=(GNN);
this->BestFitness = GNN.BestFitness;
}
return *this;
}

I do not quite see the need for avoiding self-assignment in the above
assignment operators. In fact, I do not see the need for declaring the
assignment operator at all: The compiler generated assignment operator does
member-wise assignment. Thus, you should be fine with removing all
assignment operators from both classes. (Similarly, you probably also don't
need to define the copy constructor).


Best

Kai-Uwe Bux
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,014
Latest member
BiancaFix3

Latest Threads

Top