関数オブジェクトとsort関数.
Posted: 2008年10月05日(日) 08:32
クラスsample_stringのsei, meiに対してソートを行う関数オブジェクトCSort1(), CSort2()を作成しました.
しかし,出力結果で不具合が出たので質問させてください.
return num1.sei > num2.sei; return num1.mei > num2.mei;
となっていますが,それぞれの不等号を < に変更すると
何も表示されなくなってしまいました.
<sample>
">" バージョン
e: E
d: D
c: C
b: B
a: A
"<" バージョン
:
:
:
:
:
これは何が原因となっているのでしょうか?
どちらか一方に限定して,ソートを行うべきなのでしょうか?
また,メンバ変数をprivateにするとコンパイルエラーでした.
コンストラクタで値の変更を行っているのにエラーになるのはなぜでしょうか?
しかし,出力結果で不具合が出たので質問させてください.
return num1.sei > num2.sei; return num1.mei > num2.mei;
となっていますが,それぞれの不等号を < に変更すると
何も表示されなくなってしまいました.
<sample>
">" バージョン
e: E
d: D
c: C
b: B
a: A
"<" バージョン
:
:
:
:
:
これは何が原因となっているのでしょうか?
どちらか一方に限定して,ソートを行うべきなのでしょうか?
また,メンバ変数をprivateにするとコンパイルエラーでした.
コンストラクタで値の変更を行っているのにエラーになるのはなぜでしょうか?
#include <vector> #include <algorithm> #include <iostream> class sample_string { public: std::string sei; std::string mei; sample_string(const std::string& nm="", const std::string& ph="") { sei = nm; mei = ph; } }; /* 関数オブジェクト */ class CSort1 { public: // 関数オブジェクト bool operator()(sample_string num1, sample_string num2); }; // 関数オブジェクトの定義 bool CSort1::operator()(sample_string num1, sample_string num2) { return num1.sei > num2.sei; } class CSort2 { public: // 関数オブジェクト bool operator()(sample_string num1, sample_string num2); }; // 関数オブジェクトの定義 bool CSort2::operator()(sample_string num1, sample_string num2) { return num1.mei > num2.mei; } /* 演算子オーバーロード */ std::ostream& operator<<(std::ostream &os, const sample_string& vi) { os << vi.sei << ": " << vi.mei; return os; } int main(void) { // 配列を準備する std::vector<sample_string> nums(10); int n = 0; nums[n++] = sample_string("a", "A"); nums[n++] = sample_string("c", "C"); nums[n++] = sample_string("b", "B"); nums[n++] = sample_string("d", "D"); nums[n++] = sample_string("e", "E"); // 配列の先頭から末尾までの各要素について CSort() を呼び出す(sei) std::sort( nums.begin(), nums.end(), CSort1() ); // 配列の先頭から末尾までの各要素について CSort() を呼び出す(mei) std::sort( nums.begin(), nums.end(), CSort2() ); for(int i = 0; i < n; i++) { std::cout << nums << std::endl; } return 0; }