STL sort with user defined data type

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • mweltin@gmail.com

    #1

    STL sort with user defined data type

    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

  • Kai-Uwe Bux

    #2
    Re: STL sort with user defined data type

    mweltin@gmail.c om wrote:
    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::operator=:

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


    Best

    Kai-Uwe Bux

    Comment

    • mweltin@gmail.com

      #3
      Re: STL sort with user defined data type

      On Jul 16, 3:00 pm, Kai-Uwe Bux <jkherci...@gmx .netwrote:
      mwel...@gmail.c om wrote:
      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::operator=:
      >
      A & operator= ( A const & other ) {
      B::operator=( 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::opera tor=(const NNGenome & oldNNG){
      if(this != &oldNNG){ //Check for self assignment.
      this->Epochs = oldNNG.Epochs;
      this->LearnRate = oldNNG.LearnRat e;
      this->Momentum = oldNNG.Momentum ;
      this->NNStrDef = oldNNG.NNStrDef ;
      }
      return *this;
      }

      Individual & Individual::ope rator=(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::ope rator=(const Individual& GNN){
      //check for self assigement.
      if(this != &GNN){
      NNGenome::opera tor=(GNN);
      this->BestFitness = GNN.BestFitness ;
      }
      return *this;
      }

      Comment

      • Kai-Uwe Bux

        #4
        Re: STL sort with user defined data type

        mweltin@gmail.c om wrote:
        On Jul 16, 3:00 pm, Kai-Uwe Bux <jkherci...@gmx .netwrote:
        > mwel...@gmail.c om wrote:
        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::operator=:
        >>
        > A & operator= ( A const & other ) {
        > B::operator=( 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::opera tor=(const NNGenome & oldNNG){
        if(this != &oldNNG){ //Check for self assignment.
        this->Epochs = oldNNG.Epochs;
        this->LearnRate = oldNNG.LearnRat e;
        this->Momentum = oldNNG.Momentum ;
        this->NNStrDef = oldNNG.NNStrDef ;
        }
        return *this;
        }
        >
        Individual & Individual::ope rator=(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::ope rator=(const Individual& GNN){
        //check for self assigement.
        if(this != &GNN){
        NNGenome::opera tor=(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

        Comment

        Working...