在模板函数中,必须对std :: vector进行排序。 T可以是简单类型,也可以是std :: pair,例如
std::vector<double> or
std::vector<std::pair<int,Something> >
如果T是一对,则仅第一个元素应进行比较。两种情况下如何实现比较器?
我尝试过:
template<typename T>
inline bool smaller(const T& a,const T& b)
{
return a<b;
}
template<typename T,typename S>
inline bool smaller(
const std::pair<T,S>& a,
const std::pair<T,S>& b
)
{
return a.first<b.first;
}
template<typename T> inline void function(std::vector<T >& vVec)
{
...bla...
sort(vVec.begin(),vVec.end(),smaller<T>);
...bla...
}
,但是这种方式不起作用。我也尝试过专门化,但是找不到合适的语法来专门化smaller()函数。
答案 0 :(得分:3)
您可以将其包装在lambda中:
std::sort(vVec.begin(),vVec.end(), [](const auto& a, const auto& b) { return smaller(a, b); });
答案 1 :(得分:3)
一种简单的解决方法是使smaller
结构的两个opeator()
函数smaller
都具有。使用
struct smaller
{
template<typename T>
bool operator()(const T& a,const T& b)
{
return a < b;
}
template<typename T, typename S>
bool operator() (const std::pair<T, S>& a, const std::pair<T, S>& b)
{
return a.first < b.first;
}
};
允许您像这样将smaller
传递给sort
template<typename T> inline void function(std::vector<T >& vVec)
{
sort(vVec.begin(),vVec.end(),smaller{});
}
,在sort
中,重载分辨率将在两个较小的operator()
上起作用,对于任何std::vector<std::pair>
,将调用std::pair
重载。