如何在STL中设置自定义的默认比较函数
How to set self-defined default compare function in STL
假设现在我有一个二维坐标数组,我想根据两个条件选择两个坐标:
- 选择最左和最右坐标
- 选择顶部和底部坐标
为了完成这个任务,我定义了以下函数:
template <typename T>
class Coordinate //:public common::BasicCoordinate<T>
{
public:
T x_; ///< x_coordinate
T y_; ///< y_coordinate
};
template<typename T>
struct compare_x_coordinate
{
bool operator() (const Coordinate<T> &i,const Coordinate<T> &j)
{ return i.x_<j.x_; }
} ;
template<typename T>
struct compare_y_coordinate
{
bool operator() (const Coordinate<T> &i,const Coordinate<T> &j)
{ return i.y_<j.y_; }
} ;
然后我要做的是写一个函数,它从基于compare_x_coordinate
或compare_y_coordinate
的坐标范围中选择两个坐标。我可以用两个函数来做到这一点:
template<typename T >
void find_left_right_points(const std::vector<Coordinate<T> > &ptArray,
Coordinate<T> &left,
Coordinate<T> &right )
{
compare_x_coordinate<T> mycompare;
std::vector<Coordinate<T> >::const_iterator it_max = std::max_element(ptArray.begin(), ptArray.end(), mycompare);
int index_max = it_max-ptArray.begin();
std::vector<Coordinate<T> >::const_iterator it_min = std::min_element(ptArray.begin(),ptArray.end(),mycompare);
int index_min = it_min-ptArray.begin();
left = ptArray[index_min];
right = ptArray[index_max];
} ;
和
template<typename T >
void find_top_bottom_points(const std::vector<Coordinate<T> > &ptArray,
Coordinate<T> &left,
Coordinate<T> &right )
{
compare_y_coordinate<T> mycompare;
std::vector<Coordinate<T> >::const_iterator it_max = std::max_element(ptArray.begin(), ptArray.end(), mycompare);
int index_max = it_max-ptArray.begin();
std::vector<Coordinate<T> >::const_iterator it_min = std::min_element(ptArray.begin(),ptArray.end(),mycompare);
int index_min = it_min-ptArray.begin();
left = ptArray[index_min];
right = ptArray[index_max];
} ;
当然,最好的方法是将这两个函数合二为一:
template<typename T >
void find_points(const std::vector<Coordinate<T> > &ptArray,
Coordinate<T> &left,
Coordinate<T> &right,
// I do not know how to write the default comparasion function
)
{
// compare_x_coordinate<T> mycompare;
std::vector<Coordinate<T> >::const_iterator it_max = std::max_element(ptArray.begin(), ptArray.end(), mycompare);
int index_max = it_max-ptArray.begin();
std::vector<Coordinate<T> >::const_iterator it_min = std::min_element(ptArray.begin(),ptArray.end(),mycompare);
int index_min = it_min-ptArray.begin();
left = ptArray[index_min];
right = ptArray[index_max];
} ;
但是,我不知道如何在上面的例子中编写默认的比较函数,有什么想法吗?谢谢。
编辑:该函数的一个可能的应用应该是:
void main(void)
{
std::vector<Coordinate> ptArray;
// step 1: fill the coordinates
ptArray.push_back(...)
// step 2: select the most left and right coordinates
Coordinate left, right;
find_points(ptArray,left,right);
// step 3: select the top and bottom coordinates
Coordinate top,bottom;
find_points(ptArray, top,left, find_top_bottom_points);
}
如果我理解正确的话,一种方法是:
template<typename T, class Compare >
void find_points(const std::vector<Coordinate<T> > &ptArray,
Coordinate<T> &left,
Coordinate<T> &right,
const Compare &cmp) {
find_points(ptArray, left, right, cmp);
}
template<typename T >
void find_points(const std::vector<Coordinate<T> > &ptArray,
Coordinate<T> &left,
Coordinate<T> &right) {
find_points(ptArray, left, right, default_compare);
}
您也可以使用boost::function(但可能会损失性能):
template<typename T >
void find_points(const std::vector<Coordinate<T> > &ptArray,
Coordinate<T> &left,
Coordinate<T> &right,
const boost::function<bool(const Coordinate<T>&, Coordinate<T>&)> &cmp =
compare_x_coordinate<T>())
{
...
}
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 如何使用默认参数等选择模板专业化
- 具有默认模板参数的多态类的模板推导失败
- 没有默认构造函数作为模板参数的自定义比较器
- 用户定义的结构是否有默认C++比较器?
- 通过默认复制构造函数比较 C++ 字符串是否会影响性能,原因为何?
- 在priority_queue中使用默认容器但自定义比较器
- 如何比较C 中的两个字符串并使用默认功能
- 为什么<wstring>使用自定义 wcscmp 和 wmemcmp 比较器对向量进行排序比默认快得多?
- 为什么要使用std ::少用作默认函数来比较std :: map and std :: set中的键
- 在Template中设置默认比较类型
- 如何在自己的类中使用默认比较器
- 设置类忽略定义的 comp fn 和默认比较中的错误
- 为什么 std::sort 有两个实现(带和不带比较器),而不是一个带有默认模板参数的实现
- 当我只对比较部分值感兴趣而不能假设另一部分的默认构造函数时,如何使用 std::lower_bound
- C++/STL默认比较器
- 不能与默认构造的右值进行比较
- 使用非默认比较谓词的集合容器
- 如何在STL中设置自定义的默认比较函数