
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件)
- 最新から表示
- 回答順に表示
No.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
むー、なるほど。なんか、クラスのプライベート変数とプライベートメソッドで実現できて
おかしくなさそうな(あくまで感覚根拠)ことができないというのは、結構歯がゆいものが
ありますね……。比較メソッドで使う変数をグローバルで用意しておくという方法も、あり
っちゃありな気もしてきます。
比較メソッド専用クラスを使った方法もちょっと試してみて、コンパイルが通ったらばまた
ご報告させていただきます。
No.2
- 回答日時:
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>)’
と出ます。
No.1
- 回答日時:
その「プライベート変数」がどのように定義されているかにもよるんだけど, そのクラスの中で適当なメンバ関数を作ればいけるような気もす
る. 少なくとも, パブリックにする必要はない.お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/06 09:28
- Excel(エクセル) Excelで、ゴルフ場、ボウリング場、フィットネスクラブの利用者数比較をしたいです。 しかしフィット 4 2022/11/20 22:17
- その他(プログラミング・Web制作) このプログラミングをどう組みますか? Googlecolabでやってるんですが、出来る方お願いします 1 2022/07/13 10:52
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/17 18:41
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# メインプログラムに#include <algorithm>を書いて、 そのメインプログラムが // 3 2023/05/02 11:24
- Word(ワード) 数値に差のあるデータを分かりやすく比較する方法について。医療現場におけるヒヤリハットの発生件数を事例 3 2022/07/18 14:24
- 物理学 ファンデルワールス状態方程式の臨界時の状態量を求める際、臨界体積VrはVの3次関数の極値でもあり変曲 1 2023/03/25 17:51
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
C++のfor文について
-
main.c:7:43: warning: implici...
-
intとINTの違いは?
-
VC6でlong longでエラー?
-
構造体の要素すべてに対する四...
-
long型の定数の末尾にLを付ける...
-
マージソートのプログラム
-
STLのsortで、プライベート変数...
-
TCP/IPでのgetsockname()の使い...
-
【#define】 defineで定義した...
-
2重定義って??
-
visualstudio C# テキストボッ...
-
C++でboolにintの値を代入する...
-
識別子が定義されていませんと...
-
int main の前のint add(int a,...
-
sshdログの意味
-
64bit → 32bit型へのキャスト
-
構造体の宣言でエラーが出ます。
-
unsigned *という宣言について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
long型の定数の末尾にLを付ける...
-
visualstudio C# テキストボッ...
-
typedef enumの使い方を教えて...
-
2重定義って??
-
C++のfor文について
-
C++でboolにintの値を代入する...
-
main.c:7:43: warning: implici...
-
【#define】 defineで定義した...
-
構造体の要素すべてに対する四...
-
void func( void )について
-
enumについて
-
プログラムの中で別のmainを呼...
-
intとINTの違いは?
-
エラー「invalid conversion fr...
-
ハンドルされていない例外が発...
-
変数の型を定義しなかった場合...
-
関数の実体定義にヘッダファイ...
-
構造体の宣言でエラーが出ます。
-
C言語のコンパイルエラー
おすすめ情報