環境 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);
}
正しいかか知りません。
実は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);
}
あくまで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);
wclrp ( 'o')さん、maruさん、お世話になります
ありがとうございました、演算子を多重定義をするのが、ポイントですね
よく理解できました、いろいろ応用してみようと思います。
> 演算子を多重定義をするのが、ポイントですね
本当に operator== を再定義していいのですか?
row/col共に比較するときに == が使えなくなりますよ?
ポイントは「適材適所」です。
この例では count_if を使うが吉じゃないかしら。
> この例では 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;
}
> この例では count_if を使うが吉じゃないかしら
ですよね。
ただ、
> 構造体のvectorの中から、アルゴリズムのcount関数を使い、特定の要素を数える、
だったので、countを使うのならば、という例をだしてみました。
>> 構造体のvectorの中から、アルゴリズムのcount関数を使い、特定の要素を数える、
> だったので、countを使うのならば、という例をだしてみました。
んむ。「countを使え」が必須なら operator== を定義するっきゃないかな。
「任意の条件で、それを満たす要素の数を求めよ」って意味なら count_if ですが。