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 の両方が同じ型引数を取り、コンテナの型と比較しますNameContainer
。std::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