std :: map <T,bool>,计数值为true

fue*_*zig 14 c++ lambda dictionary countif

我有一张地图:

std::map<std::string, bool> all_triggers_didfire;
Run Code Online (Sandbox Code Playgroud)

我填写它,最后想获得真实值的数量.以下代码有效:

int count_did_fire = std::count_if(
  all_triggers_didfire.begin(), 
  all_triggers_didfire.end(), 
  [](std::pair<std::string, bool> p){return p.second;}
);
Run Code Online (Sandbox Code Playgroud)

有没有比为此定义lambda表达式更简单的方法?

Ale*_*tof 12

我会使用std :: set而不是std :: map.它们在语义上是等价的,但使用std :: set更容易.例:

std::set<std::string> triggers_that_did_fire;
int count_did_fire = triggers_that_did_fire.size();
Run Code Online (Sandbox Code Playgroud)

最初填充triggers_that_did_fire集合时,可以执行以下操作:

triggers_that_did_fire.insert(mystring); //equivalent to setting to "true" in your map
triggers_that_did_fire.remove(mystring); //equivalent to setting to "false"
Run Code Online (Sandbox Code Playgroud)

  • 不,它们在语义上不相同.bool地图可以将X映射为true,将X映射为false,或者根本不映射X. 一个集合只能包含X或不包含X. (19认同)
  • 这不是问题的答案. (6认同)
  • @Steephen,我相信作者有他/她自己的逻辑理由使用 map/set 而不是 std::vector。例如,也许作者的软件还想查询是否确实触发了特定触发器。 (2认同)

Nim*_*Nim 9

有时,一个简单的for循环更清晰:

auto count = 0;
for (auto&& p : all_triggers_didfire)
  if (p.second)
    ++count;
Run Code Online (Sandbox Code Playgroud)

编辑1:我会发布原始代码,万一有人看不到编辑历史..

auto count = 0;
for (auto& p : all_triggers_didfire)
  count += p.second;
Run Code Online (Sandbox Code Playgroud)

  • @rightfold:我不同意你的编辑 - 它切断了海报的意图.我认为这是基于意见的.您应该评论或发布我们自己的答案. (15认同)
  • @rightfold,为什么要改变?以前的方式有什么问题?依靠bool < - > int转换是如此可怕吗? (5认同)
  • @rightfold,有趣,所以你介绍一个*通用引用*来"澄清"代码?:)现在,当您查看上面的代码时,首先引起您注意的是什么?`&&`这是什么东西,它在做什么?IMO在这一点上做了一个双重尝试,并试图弄清楚那里发生了什么,而不是跳过之前的代码,因为它完全简洁......无论如何,这只是我,我猜... (4认同)
  • @rightfold,在这里使用转发引用有**零**的好处.我们知道解除引用`map <T,U> :: iterator`会产生一个左值,那么为什么还要使代码足够通用以处理不可能的rvalues呢? (3认同)
  • 依赖于这样的转换会让人感到困惑,并使代码的可读性低于if语句. (2认同)
  • @JonathanWakely另一方面,如果`auto &&`总是可以在`auto &`时使用,你可以合理地将`auto &&`读作"引用","auto&"作为"左值引用",并得出结论,除非你特意想要拒绝你已经知道在这里不可能的rvalues,`auto &&`是你不想要任何增加的复杂性时使用的简单版本.我并不完全同意这一点,但我确实认为这是一个完全合法的观点,并且这是一个简单的个人偏好问题,没有强大的技术优势或劣势. (2认同)
  • @hvd,我同意这是一个个人偏好的元素,但这也支持上述评论,说编辑别人的答案以反映没有技术优势的个人偏好是错误的 (2认同)