3

std::count()またはを使用するこの配列内のインスタンスの数をカウントする必要があるという問題がありますstd::find()。標準データ (下のコードを参照) 型を使用してこれを行う方法は知っていますが、使用してNameContainerいる .

//Type
struct NameContainer{
    char name [32];
}

//An array of containers
NameContainer *_storedNames = new NameContainer[_numberOfNames];

//An example of what I'm trying to do with a string rather than the NameContainer
std::vector<string> v(_storedNames, _storedNames + _numberOfNames);
//returns an numeric value
return std::count(v.begin(), v.end(), nameToSearch))
4

3 に答える 3

2

ファンクタを使用できます

struct names_equal {
    string comp_to;

    names_equal(string a) : comp_to(a) {}

    bool operator()(NameContainer& p) {
        return p.name == comp_to;
    }
};

そして、次のように数えます

cout << std::count_if(v.begin(), v.end(), names_equal(nameToSearch));

この方法nameToSearchは、ハードコーディングする必要はありません。


編集

を使用できず、使用する必要がある場合はcount_ifcountNameContainer を変更して == をオーバーロードします。

struct NameContainer{
    string name;

    bool operator==(string str) {
        return name == str;
    }
};

次に、このように数えます

cout << std::count(v.begin(), v.end(), nameToSearch);
于 2013-04-02T18:49:13.477 に答える
2

count_ifたとえば、述語(範囲内の要素を引数として受け入れ、boolに変換可能な値を返す単項関数)を使用して提供できます

bool myPred(NameContainer n){
  return (strcmp(n.name, "name") == 0); }

std::vector<NameContainer> v(_storedNames, _storedNames + _numberOfNames);

int i=std::count_if(v.begin(), v.end(), myPred))

strcmp()文字配列の比較に使用できます。

std::countまたはのみを使用する場合std::find:

あなたのケースでは、 count と find の両方が同じ型引数を取り、コンテナの型と比較しますNameContainerstd::count検索された値を比較するために以下を実行します。

if (*first == val) 

operator==つまり、クラスを引数としてオーバーロードする必要があります。

inline bool operator == (const NameContainer &first,const NameContainer &second){
        return (strcmp(first.name,second.name)==0);
    }

次にstd::count(v.begin(), v.end(), myObjectPredicate)) 、myObjectPredicate を NameContainer クラス オブジェクトで呼び出し、名前をベクトルで検索します。

ここに実用的なソリューションがあります。あなたはそれを詳細に改善するかもしれません:

struct NameContainer{
char name [32];
};

inline bool operator== (const NameContainer &first,const NameContainer &second){
        return (strcmp(first.name,second.name)==0);
    }



int main(int argc, char** argv) {

    NameContainer* _storedNames = new NameContainer[1];
    std::vector<NameContainer> vn(_storedNames, _storedNames + 1);

    const char* cc="piotr";
    NameContainer nc;
    memcpy(nc.name,cc,strlen(cc)+1);
    vn.push_back(nc);

    NameContainer myObjectPredicate;
    memcpy(myObjectPredicate.name,cc,strlen(cc)+1);

    int count=std::count(vn.begin(), vn.end(), myObjectPredicate);
    std::cout<<count;

    return 2400;
}

出力:

1

于 2013-04-02T18:30:52.910 に答える
1

std::count のドキュメントを読むと、比較に operator== が使用されていることがわかります。したがって、std::count を使用する場合は、比較する対象に operator== が定義されている必要があります。あなたの場合、 NameContainer に簡単に追加できます。

于 2013-04-02T18:23:47.630 に答える