プレディケートの書き方について – プログラミング – Home

プレディケートの書き方について
 
通知
すべてクリア

[解決済] プレディケートの書き方について


すこっと迷やー
 すこっと迷やー
(@すこっと迷やー)
ゲスト
結合: 16年前
投稿: 3
Topic starter  

今日は、関数オブジェクトの書き方を教えて頂けないでしょうか
2次元配列から、特定の行、列から、検索する場合、高度なことをしない場合、下記のよ
うにできるのですが、
高度なことを、習得したくて書籍なども購入して読むのですが、偶数の個数を数えると
か、単純な例しか載って居なくて、苦戦しています。よろしくお願いします、環境は
VC++2008です。
operatorを実装する、templateを準備すれば、良いというのは分るのですが・・・・・

#include <iostream>
#include <vector>
#include <functional>

using namespace std;

typedef vector<vector<int> > ProperyVector;

int main()
{
// 4列10行の配列を作る
ProperyVector array(10, vector<int>(4));
for(int i = 0; i < 10; ++i)
{
for(int j = 0; j < 4; ++j)
{
array[i][j] = i * j;
}
}
int dest = 6;

for(int start = 2; start < 10; ++start) // 検索開始行は予め分っている
{
if(array[start][1] == dest) // 検索開始列も分っている
{
cout << start << endl;
break;
}
}

//ProperyVector::iterator iter = find_if(array.begin(), array.end(), dest, Pred);
//cout << *iter << endl;

return 0;
}


引用未解決
トピックタグ
wclrp ( 'o')
 wclrp ( 'o')
(@wclrp ( 'o'))
ゲスト
結合: 18年前
投稿: 287
 

高度って何?
できないことをやろうとしているとか?


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 21年前
投稿: 600
 

なにが高度なんかよぉわからんけど、呈示されたのと同じことを find_if でやるなら:

#include <iostream>
#include <vector>
#include <functional>
#include <algorithm>

typedef std::vector<int> Property;
typedef std::vector<Property> ProperyVector;

struct Pred {
int col;
int target;
Pred(int c, int t) : col(c), target(t) {}
bool operator()(const Property& prop) const {
return prop[col] == target;
}
};

int main()
{
// 4列10行の配列を作る
ProperyVector array(10, Property(4));
for(int i = 0; i < 10; ++i) {
for(int j = 0; j < 4; ++j) {
array[i][j] = i * j;
}
}
int dest = 6;

ProperyVector::iterator iter = find_if(array.begin()+2, array.begin()+10,
Pred(1,dest));
if ( iter != array.begin()+10 ) {
std::cout << distance(array.begin(), iter) << std::endl;
}
return 0;
}


返信引用
すこっと迷やー
 すこっと迷やー
(@すこっと迷やー)
ゲスト
結合: 16年前
投稿: 3
Topic starter  

wclrp ( 'o')さん、επιστημηさん
お世話になります。返信が遅くなりましたごめんなさい。
>>高度って何?
関数オブジェクトや、アルゴリズムを用いた、プログラムを、勝手にそう表現しました、
言葉足らずで、すみませんでした。

一点教えて、頂きたいのですが。
επιστημηさんが示してくださった
struct Pred {
int col;
int target;
Pred(int c, int t) : col(c), target(t) {}
bool operator()(const Property& prop) const {
return prop[col] == target;
}
};

Pred(int c, int t) : col(c), target(t) {}
この部分で、2つの、int型パラメータを持たせた、コンストラクタを生成しています

bool operator()(const Property& prop) const
そして、関数オブジェクトへオーバーロードさせていますが
この関数オブジェクトのパラメータは、int型のvectorコンテナなのに
引数の型が異なるのに、オーバーロードができていることが、不思議です、理由を
教えていただけないでしょうか。よろしくお願いします。


返信引用
すこっと迷やー
 すこっと迷やー
(@すこっと迷やー)
ゲスト
結合: 16年前
投稿: 3
Topic starter  

気づきました(^^;
return prop[col] == target;
ここの部分、colとtargetに使われるからですね。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました