计算结构向量中的匹配。

时间:2013-04-02 18:21:13

标签: c++ arrays vector iterator std

我有一个问题,需要我计算这个数组中使用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))

3 个答案:

答案 0 :(得分: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

count和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;
}

输出:

  

1

答案 1 :(得分: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和overload ==。

struct NameContainer{
    string name;

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

然后像这样计算

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

答案 2 :(得分:1)

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