如何根据特定标准在 vector<struct> 中使用 count() 函数
Posted
技术标签:
【中文标题】如何根据特定标准在 vector<struct> 中使用 count() 函数【英文标题】:How to use count() function in a vector<struct> according to specific criteria 【发布时间】:2015-10-09 09:48:00 【问题描述】:我有一个包含一些元素的 struct 类型的向量,并试图计算一个元素(值)在其对应的向量列中出现的次数。我知道如何依靠一个简单的向量,例如vector of type string
。但我坚持vector<struct>
。任何可能的解决方案或建议?
示例代码:
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
struct my_struct
std::string first_name;
std::string last_name;
;
int main()
std::vector<my_struct> my_vector(5);
my_vector[0].first_name = "David";
my_vector[0].last_name = "Andriw";
my_vector[1].first_name = "Jhon";
my_vector[1].last_name = "Monta";
my_vector[2].first_name = "Jams";
my_vector[2].last_name = "Ruth";
my_vector[3].first_name = "David";
my_vector[3].last_name = "AAA";
my_vector[4].first_name = "Jhon";
my_vector[4].last_name = "BBB";
for(int i = 0; i < my_vector.size(); i++)
int my_count=count(my_vector.begin(), my_vector.end(),my_vector[i].first_name);
/*I need help to count the number of occerencess of each "First_name" in a vector
For example: First_Name:- David COUNT:- 2 ...and so on for each first_names*/
std::cout << "First_Name: " << my_vector[i].first_name << "\tCOUNT: " << my_count << std::endl;
return 0;
但是,字符串类型的向量,std::vector<std::string>
的相同代码可以正常工作。见下文:
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
int main()
std::vector<std::string> my_vector;
my_vector.push_back("David");
my_vector.push_back("Jhon");
my_vector.push_back("Jams");
my_vector.push_back("David");
my_vector.push_back("Jhon");
for(int i = 0; i < my_vector.size(); i++)
int my_count = count(my_vector.begin(), my_vector.end(),my_vector[i]); //this works good
std::cout << "First_Name: " << my_vector[i] << "\tCOUNT: " << my_count << std::endl;
return 0;
【问题讨论】:
【参考方案1】:你必须使用正确的谓词std::count_if
:
int my_count = std::count_if(my_vector.begin(), my_vector.end(),
[&](const my_struct& s)
return s.first_name == my_vector[i].first_name;
);
Demo
在 C++03 中替换 lambda 的函子:
struct CompareFirstName
explicit CompareFirstName(const std::string& s) : first_name(s)
bool operator () (const my_struct& person) const
return person.first_name == first_name;
std::string first_name;
;
然后
int my_count = std::count_if(my_vector.begin(), my_vector.end(),
CompareFirstName(my_vector[i].first_name));
Demo
【讨论】:
你好@jarod42,你能指导我如何使用“std::count_if()”吗? 我看到了“演示”,但有一些错误。错误:“]”标记之前的预期主表达式和:“const”之前的预期主表达式。谢谢。我正在使用 gcc 版本 4.4.7 20120313 (Red Hat 4.4.7-11) (GCC)' 由于您无法访问 C++11,因此您必须使用仿函数而不是 lamdba。 这是完美的解决方案!!谢谢。以上是关于如何根据特定标准在 vector<struct> 中使用 count() 函数的主要内容,如果未能解决你的问题,请参考以下文章