2013-04-02 42 views
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)) 

回答

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_if,且必须count然后修改NameContainer和超载==它。

struct NameContainer{ 
    string name; 

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

再算上这样

cout << std::count(v.begin(), v.end(), nameToSearch); 
+0

他无法使用count_if! – 4pie0

+0

我修好了。但我不明白他为什么可以使用'count'而不是'count_if' – 2013-04-02 19:05:04

+0

非常感谢。关于明确的性质,它是一项任务的一部分,需要这两者之一。 – user2211776

1

阅读关于std :: count的文档,您会发现它使用operator ==进行比较。因此,如果你想使用std :: count,你想要比较的东西必须有一个为它定义的运算符==。在你的情况下,你可以很容易地添加一个到你的NameContainer。

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::countstd::find

计数和发现使用相同类型的参数来比较作为conatainer的类型,你的情况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; 
} 

输出:

+0

它必须是要么的std ::计数()或std :: find()方法 – user2211776

+0

感谢您的帮助,我不认为这将是简单。 – user2211776

+0

@ user2211776查看完整示例 – 4pie0