有没有更有效的方法来对两个数字进行排序?

Phi*_*l H 6 c++

我想要dLowerdHigher分别拥有两个双精度值中的较低和较高的值 - 即,如果它们是错误的,则对它们进行排序。最直接的答案似乎是:

void ascending(double& dFirst, double& dSecond)
{
    if(dFirst > dSecond)
        swap(dFirst,dSecond);
}

ascending(dFoo, dBar);
Run Code Online (Sandbox Code Playgroud)

但是这似乎是一件很明显的事情,我想知道我是否只是没有使用正确的术语来找到标准例程。

另外,您将如何使其通用?

Mag*_*off 5

这是接近它的好方法。它与您将获得的效率一样高。我怀疑这个特定的函数是否有一个公认的名字。这显然被称为比较交换。

将它概括为类型很简单:

template <typename T>
void ascending(T& dFirst, T& dSecond)
{
    if (dFirst > dSecond)
        std::swap(dFirst, dSecond);
}
Run Code Online (Sandbox Code Playgroud)

验证此功能:

int main() {
    int a=10, b=5;
    ascending(a, b);
    std::cout << a << ", " << b << std::endl;

    double c=7.2, d=3.1;
    ascending(c, d);
    std::cout << c << ", " << d << std::endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这打印:

5, 10
3.1, 7.2
Run Code Online (Sandbox Code Playgroud)


Ste*_*sop 5

玩“极其通用”的游戏:

template <typename T, typename StrictWeakOrdering>
void comparison_swap(T &lhs, T &rhs, StrictWeakOrdering cmp) {
    using std::swap;
    if (cmp(rhs, lhs)) {
        swap(lhs, rhs);
    }
}

template <typename T>
void comparison_swap(T &lhs, T &rhs) {
    comparison_swap(lhs, rhs, std::less<T>());
}
Run Code Online (Sandbox Code Playgroud)

这会勾选以下框:

  • 使用小于比较器,该比较器更容易用于用户定义的类型,因为它用于标准算法中。
  • 比较器是可选配置的,并且默认为合理的值(如果您愿意,可以使用std::greater<T>默认值并进行相应修改)。它还保证对相同类型的任意指针有效,但事实operator<并非如此。
  • 使用 的特化std::swap,或swapADL 找到的函数,以防类型 T 提供其中一个而不提供另一个。

不过,可能有些盒子我已经忘记了。