我有一个派生自Eigen模板的Matrix类:
template<typename T,
int _Rows = Eigen::Dynamic,
int _Cols = Eigen::Dynamic>
class Matrix : public Eigen::Matrix<T, _Rows, _Cols>
我需要将此类型用作std::map
容器的键,因此我需要一个比较器对象。我想专门为此目的std::less
。没有编译的草稿版本看起来像这样,为了你的想法:
template<typename Matrix<typename T,
int _Rows = Eigen::Dynamic,
int _Cols = Eigen::Dynamic> > >
struct less
{
bool operator()(const Matrix<T,
Rows,
Cols>& lhs,
const Matrix<T,
Rows,
Cols>& rhs) const;
{
Matrix<T,
Rows,
Cols>::const_iterator lhsIt = lhs.begin();
Matrix<T,
Rows,
Cols>::const_iterator rhsIt = rhs.begin();
for (;
lhsIt != lhs.end();
++lhsIt, ++rhsIt)
{
if (*lhsIt < *rhsIt)
{
return true;
}
}
return false;
}
};
问题是我想使用模板专门化std::less
。对此进行编码的正确方法是什么?我是否必须采用模板专业化?
我还需要以类似的方式对std::hash
进行专门化,以便能够使用std::map
。
答案 0 :(得分:7)
问题是我想使用模板专门化
std::less
。
唐&#39;吨。 std::less
表示&#34;致电<
运营商&#34;为这堂课&#34 ;;将它专门用于没有<
运算符的类对于阅读代码的其他人来说是不必要的混淆,并且专门用于具有<
运算符的类是毫无意义的。
只需实施正确的operator<
重载,您就可以在std::map
中使用它。
不,你不是。这只是我还需要以类似的方式对
std::hash
进行专门化,以便能够使用std::map
。
unordered_map
所需要的。
顺便说一下,你的比较算法是错误的。它会报告[2, 1] < [1, 2]
和 [1, 2] < [2, 1]
。更不用说当两个矩阵具有不同数量的元素时它不会处理这种情况。
答案 1 :(得分:5)
正确的语法是
template <typename T, int Row, int Col>
struct less<Matrix<T, Row, Col>>
{
bool operator()(const Matrix<T, Row, Col>& lhs,
const Matrix<T, Row, Col>& rhs) const
{
// implementation:
return lexicographical_compare(lhs.begin(), lhs.end(), rhs.begin(), rhs.end());
}
};
这是一个专业化。
顺便说一句,你的实现不尊重要求:(它不对称)。