ページ 1 / 1
vectorのsort(要素はポインタ)
Posted: 2012年3月22日(木) 23:40
by miko
現在vectorのソートに挑戦しているのですが、要素がポインタになると、なかなかうまくいきません。
どのようにしたらsortメソッドでソートできるでしょうか。
コード:
class sample
{
private:
[tab=30]int value1;
[tab=30]int value2;
public:
sample(int value1, int value2)
[tab=30]{
[tab=30][tab=30]this->value1= value1;
[tab=30][tab=30]this->value2= value2;
}
};
int main()
{
[tab=30]vector<sample *> data;
[tab=30]data.push_back(new sample(10,80));
[tab=30]data.push_back(new sample(10,40));
//昇順
[tab=30]std::sort(data.begin(), data.end());
}
Re: vectorのsort(要素はポインタ)
Posted: 2012年3月23日(金) 00:00
by h2so5
そもそも、例えば sample(10,80) と sample(10,40) は昇順でソートした時にどっちが上に来るべきなんですか?
それを決めていないとソートしようがないと思いますが。
Re: vectorのsort(要素はポインタ)
Posted: 2012年3月23日(金) 00:08
by miko
h2so5 さんが書きました:そもそも、例えば sample(10,80) と sample(10,40) は昇順でソートした時にどっちが上に来るべきなんですか?
それを決めていないとソートしようがないと思いますが。
記載し忘れましたすみません。。。
この場合ですとvalue2でソートしたいと思います。
調べて下記をsampleクラスに実装したのですが。。。
コード:
bool operator>(elem & right)
{
return this->posY > right.posY;
}
bool operator<(elem & right)
{
return this->posY < right.posY;
}
Re: vectorのsort(要素はポインタ)
Posted: 2012年3月23日(金) 00:30
by h2so5
そのままだとポインタの数値の比較になってしまいますので、
独自の比較関数を定義してstd::sortに渡す必要があります。
このようなコードになります。
コード:
#include <vector>
#include <iostream>
class sample
{
private:
int value1;
int value2;
public:
sample(int value1, int value2) {
this->value1= value1;
this->value2= value2;
}
// 比較関数
static bool cmp(sample *a, sample *b)
{
return (a->value2 < b->value2);
}
};
int main()
{
std::vector<sample *> data;
data.push_back(new sample(10,80));
data.push_back(new sample(10,40));
//昇順
std::sort(data.begin(), data.end(), &sample::cmp);
return 0;
}
また、質問とは直接関係ないですがクラスのメンバの初期化は
コード:
sample(int value1, int value2) {
this->value1= value1;
this->value2= value2;
}
ではなくて
コード:
sample(int val1, int val2) : value1(val1), value2(val2) {
}
のようにメンバ初期化リストを使ってください。
Re: vectorのsort(要素はポインタ)
Posted: 2012年3月23日(金) 11:07
by miko
>>h2so5 様
ありがとうございます!おかげ様で無事ソートに成功しました。
メンバ変数の初期化はそのようにやるべきなのですね。大変勉強になります。
また失礼するかもしれませんが、そのときはよろしくお願いいたします。