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

例如,您可以使用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::countor 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 回答
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);
于 2013-04-02T18:49:13.477 回答
1

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

于 2013-04-02T18:23:47.630 回答