我有一个问题,需要我计算这个数组中使用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))
答案 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::count
或std::find
:
count和find都采用与conatainer类型相同的类型参数进行比较,在您的情况下为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
答案 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中添加一个。