1

多くの調査とこの問題の解決を試みた後

C++ で List of Objects を注文する方法があるかどうか知りたかったのです。

これまでに見たすべてのソリューションでは、ソートに使用するキャンプを事前に定義する必要があります。

私が欲しかったのは、ユーザーがソートに使用したいキャンプを自由に選択できることでした。ここに私のコードがあります

class LOL
{
   public:
   LOL( const string& Nickname = "", int skill = 0,int level= 0 );
   bool operator > ( const LOL &rhs ) const; 
   void print() const;

   private:
   int level_;
   string Nickname_;
   int skill_;
};

inline
LOL::LOL( const string& Nickname, int skill, int level)
   : level_( level), Nickname_( Nickname ), skill_( skill )
{} 



inline
bool LOL::operator > ( const LOL& rhs ) const
{ return Nickname_  > rhs.Nickname_; } 



inline
void LOL::print() const
{ cout << Nickname_ << " from level " << level_
   << " has skill of [ " << skill_ <<" ]"<< endl<< endl;
}

int main( )
{
   list<LOL> list1;
   list1.push_back( LOL( "Dhespair", 50000, 30 ) );
   list1.push_back( LOL( "Pedro", 1, 1 ) );
   list1.push_back( LOL( "Blackblood", 99999, 30 ) );
   list1.push_back( LOL( "Zladovic", 30000, 25 ) );

   list1.sort( greater <LOL>()  );
   for_each( list1.begin(), list1.end(), mem_fun_ref( &LOL::print ) );
   printf("\n\n");
   system("pause");
}

数回試した後、私はこの解決策を思いつきました

class LOL
{
   public:
   LOL( const string& Nickname = "", int skill = 0,int level= 0 , int op=1);
   bool operator > ( const LOL &rhs        ) const; // MUDAR O > para maior  ou < MENOR
   bool operator < ( const LOL &rhs        ) const; // MUDAR O > para maior  ou < MENOR
   void print() const;

   private:
   int level_;
   string Nickname_;
   int skill_;
   int op_;
};

inline
LOL::LOL( const string& Nickname, int skill, int level, int op)
   : level_( level), Nickname_( Nickname ), skill_( skill ), op_( op )
{} 



inline
bool LOL::operator > ( const LOL& rhs ) const
{ 
    switch(rhs.op_)
    {
    case 1:
    return Nickname_  > rhs.Nickname_; 
    break;

    case 2:
    return level_  > rhs.level_; 
    break;

    case 3:
    return skill_ > rhs.skill_; 
    break;
    } // MUDAR O  > para maior  ou < MENOR e ESCOLHER CAMPO A TER EM CONTA
}

inline
bool LOL::operator < ( const LOL& rhs ) const
{ 
    switch(rhs.op_)
    {
    case 1:
    return Nickname_  < rhs.Nickname_; 
    break;

    case 2:
    return level_  < rhs.level_; 
    break;

    case 3:
    return skill_ < rhs.skill_; 
    break;
    } // MUDAR O  > para maior  ou < MENOR e ESCOLHER CAMPO A TER EM CONTA
}


inline
void LOL::print() const
{ cout << Nickname_ << " from level " << level_
   << " has skill of [ " << skill_ <<" ]"<< endl<< endl;
}

int main( )
{
   list<LOL> list1;
   list1.push_back( LOL( "Dhespair", 50000, 30,3 ) );
   list1.push_back( LOL( "Pedro", 1, 1,3 ) );
   list1.push_back( LOL( "Blackblood", 99999, 30,3) );
   list1.push_back( LOL( "Zladovic", 30000, 25,3 ) );

   list1.sort( less <LOL>()  );
   for_each( list1.begin(), list1.end(), mem_fun_ref( &LOL::print ) );
   printf("\n\n");
   system("pause");
}

私がしたことは、bool 演算子内で switch ケースを操作するために使用するオブジェクトに新しい値を設定することでした。

それは機能しますが、誰かが私のオブジェクトに新しいパラメーターを持たなくてもそのスイッチを使用する方法を知っていれば、私は本当に感謝します x)

よろしくお願いします

4

1 に答える 1

0
bool compareTwoLOLObjectsWay1(LOL &A, LOL &B)
{
  /* Logic to determine if A<B */
}

bool compareTwoLOLObjectsWay2(LOL &A, LOL &B)
{
  /* Logic to determine if A>B */
}

switch(sortWay)
{
  case 1:
    list1.sort(&compareTwoLOLObjectsWay1);
    break;
  case 2:
    list1.sort(&compareTwoLOLObjectsWay2);
    break;
}
于 2013-01-10T22:37:19.330 に答える