【问题标题】:Difference between std::adjacent_find() and std::equal() for checking if all elements in vector are equalstd::adjacent_find() 和 std::equal() 之间的区别,用于检查向量中的所有元素是否相等
【发布时间】:2021-11-10 22:37:06
【问题描述】:

我正在尝试找出两者之间的区别:

return std::adjacent_find(v.begin(), v.end(), std::not_equal_to<>()) == v.end();

return std::equal(v.begin() + 1, v.end(), v.begin());

后者有点短,所以我更喜欢写它,我发现唯一的区别是它会因空数组而崩溃。速度差不多。

【问题讨论】:

  • 问题到底是什么?
  • @463035818_is_not_a_number ?
  • @463035818_is_not_a_number 新标题。这可能就是你的意思。

标签: c++ c++11 c++14


【解决方案1】:

我的直接建议是避免这两种情况。告诉读者你的意图也不好。我可能会使用更像这样的东西:

return std::all_of(v.begin(), v.end(), 
                   [&](auto const &i) { return i == v.front(); });

至少对我来说,这似乎使意图更加明显(这比源代码的字节数重要得多)。

【讨论】:

  • 理论上,这也应该比 OP:s 第二版更便宜、更安全。只有一个迭代器,没有解除引用的风险end()
  • @TedLyngmo:是的,理论上。在实践中,如果它更快,我会感到惊讶 - 但我会满足于同样快速和更具可读性。
  • ...如果范围为空,我的意思是...
  • 我用一堆不同的字符串/双向量进行了 10 万次迭代,所有元素都相等或一个元素只有一点点偏差。他们的表现几乎都一样。
  • @Det:我认为几乎任何理性的程序员都能理解他们的意思。但是对于你的任何一个,我认为一个理性的程序员最终可能会挠头一分钟并想知道:“这真的是他的意思吗?”而对于all_of,至少在我看来,结果显然符合意图。
猜你喜欢
  • 2013-12-15
  • 1970-01-01
  • 1970-01-01
  • 2013-10-18
  • 2014-03-04
  • 2013-01-18
  • 2012-04-25
相关资源
最近更新 更多