如何计算 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 );