初めて自分の家と他人の家が違う、と意識した時

STLのsort()の使い方が分からず困っています。

定義したクラスから生成したオブジェクト群を list で管理しています。
↓こんな形です。
class cMyClass
{
int m_Attr;
public:
cMyClass();
~cMyClass();
};

std :: list <cMyClass*> m_MyList;
m_MyList.push_back(new cMyClass);
m_MyList.push_back(new cMyClass);
...

この、m_MyListを cMyClass内の要素 m_Attr の大小でソートしたいのですが、どうにもやり方が分りません。。。
教えていただけないでしょうか。
よろしくお願いします。

A 回答 (2件)

#include <list>


#include <cstdlib>
#include <ctime>
#include <iostream>

class cMyClass
{

public:
/* getter,setterを作るべきなのかわからん。一応比較用の関数で参照するのでpublicにした */
int m_Attr;
cMyClass(){
m_Attr = std::rand();
}
~cMyClass();
};

bool cMyClass_compare(cMyClass* a, cMyClass* b){
if (a->m_Attr < b->m_Attr){
return true;
}else{
return false;
}
}

int main(void){
std::srand(std::time(NULL));
std :: list <cMyClass*> m_MyList;
m_MyList.push_back(new cMyClass);
m_MyList.push_back(new cMyClass);
m_MyList.push_back(new cMyClass);
m_MyList.push_back(new cMyClass);
m_MyList.push_back(new cMyClass);
m_MyList.push_back(new cMyClass);

m_MyList.sort(cMyClass_compare);

for (std::list<cMyClass*>::iterator it=m_MyList.begin(); it!=m_MyList.end(); ++it){
std::cout << " " << (*it)->m_Attr;
}


}
    • good
    • 0
この回答へのお礼

早速の回答ありがとうございました。

早速試して、動作が確認できました。
ありがとうございました!

お礼日時:2008/08/17 23:16

 こんばんは。

こんな感じ?
 Set/Getが無かったのでstatic/friendで触るようにしてます。

#include<stdio.h>
#include<list>

class cMyClass
{
int m_Attr;
public:
explicit cMyClass(int attr) : m_Attr(attr){}
~cMyClass(){}

//static members
//operator < (l, r)へ転送
static bool Less(const cMyClass* p, const cMyClass* q)
{
return *p < *q;
}

//std::for_eachのコールバック用(表示する)
static void Display(const cMyClass* p)
{
::printf("[m_Attr:%d] [pointer:%p]\n", p->m_Attr, p);
}

//operator
//二項演算子
friend bool operator < (const cMyClass& lhs, const cMyClass& rhs)
{
return lhs.m_Attr < rhs.m_Attr;
}
};

//test
void main()
{
std::list <cMyClass*> m_MyList;
m_MyList.push_back(new cMyClass(50));
m_MyList.push_back(new cMyClass(3));
m_MyList.sort(&cMyClass::Less);

std::for_each(m_MyList.begin(), m_MyList.end(), cMyClass::Display);
}
    • good
    • 0
この回答へのお礼

早速の回答ありがとうございました。

早速試して、動作が確認できました。
ありがとうございました!

お礼日時:2008/08/17 23:17

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報