ページ 11

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 様
ありがとうございます!おかげ様で無事ソートに成功しました。
メンバ変数の初期化はそのようにやるべきなのですね。大変勉強になります。

また失礼するかもしれませんが、そのときはよろしくお願いいたします。