分别比较对的相等性、更小和更大。
Comparing pairs separately for equality, less and greater.
假设我有一对 std::pair<int, int>
。我希望每次比较它们时都发出一个单独的代码来表示相等性,较小和较大(例如,分别为 0、-1 和 1)。
天真的方法是编写一些 if
-else
代码:
int compare_int_pairs(std::pair<int, int> const &p1_, std::pair<int, int> const &p2_) {
if(p1_.first < p2_.first) {
return -1;
} else if(p1_.first > p2_.first) {
return 1;
} else {
if(p1_.second < p2_.second) {
return -1;
} else if(p1_.second > p2_.second) {
return 1;
} else {
return 0;
}
}
return 0;
}
但是是否有更好、更有效的方法来执行此操作(例如,按位运算或其他方式)?
std::pair
已经通过标准运算符公开了字典顺序,因此您可以直接使用它们:
int compare_int_pairs(std::pair<int, int> const &p1_, std::pair<int, int> const &p2_) {
if (p1_ < p2_) return -1;
if (p1_ > p2_) return 1;
return 0;
}
如果确实需要,可以使用条件表达式来简洁。
如果您不坚持使用值 -1、0 和 1,但也可以接受负数、0 和正数作为结果,这是我能想到的最快速度:
#include <utility>
#include <stdint.h>
int compare_int_pairs(std::pair<int, int> const &p1_, std::pair<int, int> const &p2_) {
int ret = p1_.first - p2_.first;
if (ret == 0) ret = p1_.second - p2_.second;
return ret;
}
假设我有一对 std::pair<int, int>
。我希望每次比较它们时都发出一个单独的代码来表示相等性,较小和较大(例如,分别为 0、-1 和 1)。
天真的方法是编写一些 if
-else
代码:
int compare_int_pairs(std::pair<int, int> const &p1_, std::pair<int, int> const &p2_) {
if(p1_.first < p2_.first) {
return -1;
} else if(p1_.first > p2_.first) {
return 1;
} else {
if(p1_.second < p2_.second) {
return -1;
} else if(p1_.second > p2_.second) {
return 1;
} else {
return 0;
}
}
return 0;
}
但是是否有更好、更有效的方法来执行此操作(例如,按位运算或其他方式)?
std::pair
已经通过标准运算符公开了字典顺序,因此您可以直接使用它们:
int compare_int_pairs(std::pair<int, int> const &p1_, std::pair<int, int> const &p2_) {
if (p1_ < p2_) return -1;
if (p1_ > p2_) return 1;
return 0;
}
如果确实需要,可以使用条件表达式来简洁。
如果您不坚持使用值 -1、0 和 1,但也可以接受负数、0 和正数作为结果,这是我能想到的最快速度:
#include <utility>
#include <stdint.h>
int compare_int_pairs(std::pair<int, int> const &p1_, std::pair<int, int> const &p2_) {
int ret = p1_.first - p2_.first;
if (ret == 0) ret = p1_.second - p2_.second;
return ret;
}