count関数について – プログラミング – Home

通知
すべてクリア

[解決済] count関数について


緑のたぬき
 緑のたぬき
(@緑のたぬき)
ゲスト
結合: 16年前
投稿: 5
Topic starter  

環境 VC8 / Win Xp
よろしくお願いします。
構造体のvectorの中から、アルゴリズムのcount関数を使い、特定の要素を数える、
方法を教えて頂けないでしょうか。

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

using namespace std;

static const int five = 5;

struct Combi {
int row;
int col;
};

vector <Combi> vec;

int main()
{
int cou;
Combi combi;
for (int i = 0; i < 10; i++)
{
combi.row = i;
combi.col = i*10;
vec.push_back(combi);
}

//cou = count(vec.begin()->row, vec.end()->row, five);
}


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

正しいかか知りません。
実はstlよく知らないし、ファンクタ好きじゃないんだよな。

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

using namespace std;

static const int five = 5;

struct Combi {
int row;
int col;
class row_equal {
int val;
public:
row_equal(int r) : val(r) {}
bool operator () (const Combi & left) { return left.row == val; }
};
};

vector <Combi> vec;

void test()
{
int cou;
Combi combi;
for (int i = 0; i < 10; i++)
{
combi.row = (i*5 ^ (i>>2)) % 10;
combi.col = i * 7 % 5;
vec.push_back(combi);
TRACE(combi.row = %d\n,combi.row);
}

cou = count_if(vec.begin(), vec.end(), Combi::row_equal(five));

TRACE(cou = %d\n,cou);
}


返信引用
maru
 maru
(@maru)
ゲスト
結合: 17年前
投稿: 358
 

あくまでcountを使いたいなら、等値演算子を定義すればかんたんかも。

> struct Combi {
> int row;
> int col;
> };

struct Combi {
int row;
int col;
bool operator==(const int right)
{ return row==right;
}
};

> //cou = count(vec.begin()->row, vec.end()->row, five);
cou = count(vec.begin(), vec.end(), five);


返信引用
緑のたぬき
 緑のたぬき
(@緑のたぬき)
ゲスト
結合: 16年前
投稿: 5
Topic starter  

wclrp ( 'o')さん、maruさん、お世話になります
ありがとうございました、演算子を多重定義をするのが、ポイントですね
よく理解できました、いろいろ応用してみようと思います。


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

> 演算子を多重定義をするのが、ポイントですね

本当に operator== を再定義していいのですか?
row/col共に比較するときに == が使えなくなりますよ?

ポイントは「適材適所」です。
この例では count_if を使うが吉じゃないかしら。


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

> この例では count_if を使うが吉じゃないかしら

↓こんなのとか。

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

struct Combi {
int row;
int col;
};

struct is_equal_row {
int val;
is_equal_row(int n) : val(n) {}
bool operator()(const Combi& x) const {
return x.row == val;
}
};

int main() {
std::vector <Combi> vec;
for (int i = 0; i < 10; i++) {
Combi combi;
combi.row = (i*5 ^ (i>>2)) % 10;
combi.col = i * 7 % 5;
vec.push_back(combi);
}

std::cout << std::count_if(vec.begin(), vec.end(), is_equal_row(5))
<< items matched.\n;
}


返信引用
maru
 maru
(@maru)
ゲスト
結合: 17年前
投稿: 358
 

> この例では count_if を使うが吉じゃないかしら
ですよね。

ただ、
> 構造体のvectorの中から、アルゴリズムのcount関数を使い、特定の要素を数える、
だったので、countを使うのならば、という例をだしてみました。


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

>> 構造体のvectorの中から、アルゴリズムのcount関数を使い、特定の要素を数える、
> だったので、countを使うのならば、という例をだしてみました。

んむ。「countを使え」が必須なら operator== を定義するっきゃないかな。

「任意の条件で、それを満たす要素の数を求めよ」って意味なら count_if ですが。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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