我想要dLower并dHigher分别拥有两个双精度值中的较低和较高的值 - 即,如果它们是错误的,则对它们进行排序。最直接的答案似乎是:
void ascending(double& dFirst, double& dSecond)
{
if(dFirst > dSecond)
swap(dFirst,dSecond);
}
ascending(dFoo, dBar);
Run Code Online (Sandbox Code Playgroud)
但是这似乎是一件很明显的事情,我想知道我是否只是没有使用正确的术语来找到标准例程。
另外,您将如何使其通用?
这是接近它的好方法。它与您将获得的效率一样高。我怀疑这个特定的函数是否有一个公认的名字。这显然被称为比较交换。
将它概括为类型很简单:
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)
玩“极其通用”的游戏:
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 提供其中一个而不提供另一个。不过,可能有些盒子我已经忘记了。