std::adjacent_find() 和 std::equal() 之间的区别,用于检查向量中的所有元素是否相等

Det*_*Det -1 c++ c++11 c++14

我试图找出以下之间的区别:

return std::adjacent_find(v.begin(), v.end(), std::not_equal_to<>()) == v.end();
Run Code Online (Sandbox Code Playgroud)

return std::equal(v.begin() + 1, v.end(), v.begin());
Run Code Online (Sandbox Code Playgroud)

后者有点短,所以我更喜欢这样写,我发现的唯一区别是它因空数组而崩溃。速度大致相等。

Jer*_*fin 5

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

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

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

  • @Det:我认为任何理性的程序员都可以理解它们的含义。但对于你们中的任何一个,我认为一个理性的程序员最终可能会挠头并想知道:“这真的是他想要做的吗?” 然而,对于“all_of”,至少对我来说,结果显然符合意图。 (2认同)