std::__gcd 和 std::gcd 有什么区别?

What is the difference between std::__gcd and std::gcd?

Many websites and questions on Stack Overflow 引用名为 std::__gcd 的函数。这个函数和std::gcd有什么区别?

我对此做了一些调查。看起来 __gcd 函数是一个定义为 in the libstdc++ implementation of the <algorithm> header (line 1503) 的私有辅助函数。它仅由 std::rotate 函数在内部使用(第 1610 行)。它(可能)从未打算在库实现之外直接使用。因为它特定于 libstdc++,所以不能保证通过 g++ 以外的编译器使用此函数。从这个意义上说,您可以将 std::__gcd 函数视为一个(文档很少的)内部帮助器,它仅适用于某些 C++ 编译器。

(有趣的事实:我第一次注意到 __gcd 的存在是因为这里有一个现已删除的问题,询问它为什么不一致地处理负输入。事实证明它并不是真正设计用于处理负数,因为 libstdc++ 实现仅在输入非负的情况下使用它。这是使用未记录的内部辅助函数的风险之一!)

另一方面,std::gcd 是在 C++17 中引入的标准 C++ 库函数。这意味着任何兼容 C++17 的编译器都将支持 std::gcd,因此如果您有兼容 C++17 的编译器,最好使用此选项。

对于C++14或更低版本,您可以简单地实现您自己版本的GCD函数。 Euclid 的算法非常易于编写代码并且运行速度极快。