2013-04-02 102 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