count関数について

[戻る]
緑のたぬき 2008/10/29(水) 22:32:54
環境 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') 2008/10/29(水) 23:57:29
正しいかか知りません。
実は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 2008/10/30(木) 00:17:15
あくまで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);

緑のたぬき 2008/10/30(木) 07:46:12
[[解決]]
wclrp ( 'o')さん、maruさん、お世話になります
ありがとうございました、演算子を多重定義をするのが、ポイントですね
よく理解できました、いろいろ応用してみようと思います。

επιστημη [HomePage] 2008/10/30(木) 09:36:01
> 演算子を多重定義をするのが、ポイントですね

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

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

επιστημη [HomePage] 2008/10/30(木) 10:29:39
> この例では 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 2008/10/30(木) 12:44:30
> この例では count_if を使うが吉じゃないかしら
ですよね。

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

επιστημη [HomePage] 2008/10/30(木) 14:45:28
>> 構造体のvectorの中から、アルゴリズムのcount関数を使い、特定の要素を数える、
> だったので、countを使うのならば、という例をだしてみました。

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

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

古いスレッドには追加発言できません。