関数オブジェクトとsort関数.

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
大工

関数オブジェクトとsort関数.

#1

投稿記事 by 大工 » 17年前

クラス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にするとコンパイルエラーでした.
コンストラクタで値の変更を行っているのにエラーになるのはなぜでしょうか?
#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;
}

組木紙織

Re:関数オブジェクトとsort関数.

#2

投稿記事 by 組木紙織 » 17年前

前半部は長くなりそうなので、説明が簡単な後半部から説明をします。

>また,メンバ変数をprivateにするとコンパイルエラーでした.

>return num1.sei < num2.sei;
ここの部分で、
CSort1::operator()はsample_stringのメンバ変数に直接アクセスをしています。
よってコンパイルエラーになります。

一番単純な解決法はCsort1をsample_stringクラスのフレンドにしてあげることです。
またはsample_stringクラスにget()などのメンバ変数の値を返すメンバ関数を用意して
それを利用して、CSort1クラスを作ることです。

組木紙織

Re:関数オブジェクトとsort関数.

#3

投稿記事 by 組木紙織 » 17年前

前半部分について

std::vector<sample_string> nums(10) は要素数が10の動的配列を
確保すると言う意味です。
動的と静的で異なりますが、
sample_string nums[10]
とほぼ同じ意味だと思ってください。

次にした操作は
nums[0]~nums[4]まで値を入れるという操作なので、
nums[5]~nums[9]までは現時点では何も入っていません。

"<"でソートすると何も入ってない文字列が一番最初に来るので
nums[0]~nums[4]までは何も値は入っていないので、
何も出力されません。


初見では安定ソートと不安定ソートについても話す必要があると思って
前半部分は長くなると書いてしまいましたが、現在の問題には直接関係ないので
触れません。

大工

Re:関数オブジェクトとsort関数.

#4

投稿記事 by 大工 » 17年前

なるほど,なにかしらの内部エラーかと思ってたんですが,""のせいだったんですね^^;

ありがとうございました.

閉鎖

“C言語何でも質問掲示板” へ戻る