如何计算 C++ 映射中给定 VALUE(!) 的数量?
How to count the number of a given VALUE(!) in a C++ map?
我在另一个 iOS/ObjC 项目中确实有一个 cpp class。它使用以下地图:
std::map <std::string, int> testMap;
我知道我可以通过 testMap.count "count" 给定键在该地图中出现的次数。但是如何计算给定值在该地图中出现的次数?
例如假设有以下地图:
<Anna, 5>
<Brian, 4>
<Cesar, 4>
<Danny, 3>
--> 因此,如果我查找值“4”的数量,函数应该 return 2,对于值“5”和“3”,每个值都应该 return 1 , 否则 0...
提前致谢!
最简单的方法可能是使用 std::count_if
和适当的 lambda:
int value = 4; // or something else
std::count_if(std::begin(testMap),
std::end (testMap),
[value](std::pair<std::string, int> const &p) {
return p.second == value;
});
这只是遍历地图并计算符合谓词的所有元素。
可以简单地使用基于for语句的范围来完成:)
size_t count = 0;
int value = 4;
for ( auto &p : testMap ) count += p.second == value;
有时使用基于范围的 for 语句看起来比使用标准算法更具可读性 std::count_if。:)
另一方面,如果多次使用此操作,则使用该算法会更好。例如
int value = 4;
size_t n = std::count_if( std::begin( testMap ), std::end( testMap ),
[&value]( const std::pair<const std::string, int> &p )
{
return p.second == value;
} );
您也可以将 lambda 与算法的调用分开定义
int value;
size_t n;
auto IsEqual = [&value]( const std::pair<const std::string, int> &p )
{
return p.second == value;
};
value = 4;
n = std::count_if( std::begin( testMap ), std::end( testMap ), IsEqual );
//...
value = 5;
n = std::count_if( std::begin( testMap ), std::end( testMap ), IsEqual );
我在另一个 iOS/ObjC 项目中确实有一个 cpp class。它使用以下地图:
std::map <std::string, int> testMap;
我知道我可以通过 testMap.count "count" 给定键在该地图中出现的次数。但是如何计算给定值在该地图中出现的次数?
例如假设有以下地图:
<Anna, 5>
<Brian, 4>
<Cesar, 4>
<Danny, 3>
--> 因此,如果我查找值“4”的数量,函数应该 return 2,对于值“5”和“3”,每个值都应该 return 1 , 否则 0...
提前致谢!
最简单的方法可能是使用 std::count_if
和适当的 lambda:
int value = 4; // or something else
std::count_if(std::begin(testMap),
std::end (testMap),
[value](std::pair<std::string, int> const &p) {
return p.second == value;
});
这只是遍历地图并计算符合谓词的所有元素。
可以简单地使用基于for语句的范围来完成:)
size_t count = 0;
int value = 4;
for ( auto &p : testMap ) count += p.second == value;
有时使用基于范围的 for 语句看起来比使用标准算法更具可读性 std::count_if。:)
另一方面,如果多次使用此操作,则使用该算法会更好。例如
int value = 4;
size_t n = std::count_if( std::begin( testMap ), std::end( testMap ),
[&value]( const std::pair<const std::string, int> &p )
{
return p.second == value;
} );
您也可以将 lambda 与算法的调用分开定义
int value;
size_t n;
auto IsEqual = [&value]( const std::pair<const std::string, int> &p )
{
return p.second == value;
};
value = 4;
n = std::count_if( std::begin( testMap ), std::end( testMap ), IsEqual );
//...
value = 5;
n = std::count_if( std::begin( testMap ), std::end( testMap ), IsEqual );