電子書籍の厳選無料作品が豊富!

STLのsortで、プライベート変数を比較関数に組み入れたい。

STLのvectorのsortで比較関数を指定してソートをしようとしております。
ソートしようとするvectorは、とあるクラスのプライベート変数であり、
同じクラスの他のプライベート変数を利用した比較を行おうとしています。
例えば

int array[4] = {1, 7, 3, 5};

なるプライベート変数があり、比較関数はこんなアルゴリズムとしたいと。

bool compare(int left, int right)
{
return array[ left ] < array[ right ];
}

この compare をクラスのメソッドとして定義して使えるのかなと思っていたのですが
コンパイルしたところエラーが出ました。パブリック変数にして、プレディケートの
ためのクラスを作って、そこでパブリックメソッドを作って……という方法は見つかった
のですが、そのような面倒な方法を経なければいけないのでしょうか。

A 回答 (3件)

 こんばんは。


 良し悪しは別にして、恐らくSTLだけでは「for_each」でパラメータ2つのメンバ関数を取り扱う事に無理があるのでは。
 「boostライブラリ」の「function」や「bind」を併用した方が手っ取り早いです。
 これで良いのかはわかりませんが、以下参考程度に。

#include<vector>
#include<algorithm>
#include<iostream>
#include<boost/bind.hpp>
#include<boost/function.hpp>
#include<boost/lambda/lambda.hpp>

class vectorsorttest
{
private:
int weight[5];
std::vector<int> v;
public:
vectorsorttest()
{
int array[ 5 ] = { 1, 0, 2, 4, 3 };
//for(int i = 0 ; i < 5 ; i++)
//weight[ i ] = array[ i ];
std::copy(array, array + 5, weight);

int member[ 5 ] = { 0, 1, 2, 3, 4 };
//for(int i = 0 ; i < 5 ; i++)
//v.push_back( member[ i ] );
v.assign(member, member + 5);

//並び替え
boost::function<bool(int, int)> fun = boost::bind(&vectorsorttest::compare, this, _1, _2);
std::sort(v.begin(), v.end(), fun);

//表示
std::for_each(v.begin(), v.end(), std::cout << boost::lambda::_1 << " ");
std::cout << std::endl;
}
bool compare(int left, int right) const
{
return weight[ left ] < weight[ right ];
}
};

int main()
{
vectorsorttest test;
return 0;
}

参考URL:http://www.boost.org
    • good
    • 0
この回答へのお礼

むー、なるほど。なんか、クラスのプライベート変数とプライベートメソッドで実現できて
おかしくなさそうな(あくまで感覚根拠)ことができないというのは、結構歯がゆいものが
ありますね……。比較メソッドで使う変数をグローバルで用意しておくという方法も、あり
っちゃありな気もしてきます。

比較メソッド専用クラスを使った方法もちょっと試してみて、コンパイルが通ったらばまた
ご報告させていただきます。

お礼日時:2010/10/30 01:13

vectorといっている割には単なる配列を使っていたりと、意味不明なところが多々ありますが...


印象からすると、比較関数を静的メンバ関数にしていないためにエラーが発生しているだけのような気がします。

この回答への補足

すみません、僕もうまく考えがまとまっていないまま質問をしてしまいました。
以下のようなクラスを考えています。番号とそれに対応する重量のデータがあって、
重量順で vector をソートしたいというものです。

class vectorsorttest
{
private:
int weight[ 5 ];
vector<int> v;
public:
vectorsorttest()
{
int array[ 5 ] = { 1, 6, 2, 4, 3 };
for (int i = 0 ; i < 5 ; i++)
weight[ i ] = array[ i ];
int member[ 5 ] = { 0, 1, 2, 3, 4 };
for (int i = 0 ; i < 5 ; i++)
v.push_back( member[ i ] );
sort(v.begin(), v.end(), compare);
}

bool compare(int left, int right)
{
return weight[ left ] < weight[ right ];
}
};

これでコンパイルしますと、

error: no matching function for call to ‘sort(__gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >, __gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >, <unresolved overloaded function type>)’

と出ます。

補足日時:2010/10/29 12:44
    • good
    • 0

その「プライベート変数」がどのように定義されているかにもよるんだけど, そのクラスの中で適当なメンバ関数を作ればいけるような気もす

る. 少なくとも, パブリックにする必要はない.
    • good
    • 0

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