我正在尝试使用 blitz++ 数组,因为我知道它们通常比其他形式的数组提供更高的性能。是否可以使用 blitz++ 数组作为地图中的键?试
#include <map>
#include <blitz/array.h>
using namespace std;
map<blitz::Array<int,1>,int> testmap;
blitz::Array<int,1> B(3);
B = 1,2,3;
testmap.insert(make_pair(B,2));
不编译。这是错误:
在 /usr/include/c++/4.6/string:50:0 包含的文件中,
/usr/include/c++/4.6/bits/stl_function.h: 在成员函数'bool std::less<_Tp>::operator()(const _Tp&, const _Tp&) const [with _Tp = blitz::Array]' :
/usr/include/c++/4.6/bits/stl_function.h:236:22: 错误: 无法转换 'blitz::BzBinaryExprResult, blitz::Array >::T_result {aka blitz::_bz_ArrayExpr, blitz::FastArrayIterator, blitz ::Less > >}' 到 'bool' 作为回报
这是需要定义<
运算符的问题吗?如果是,我可以/应该自己定义它吗?
回答
正如 Jimmy Thompson 所建议的,一个可能的解决方案是定义:
struct MyComparison
{
bool operator() (const blitz::Array<int, 1> &lhs, const blitz::Array<int, 1> &rhs) const
{
if (lhs.size() < rhs.size()) {return true;}
else if (lhs.size() > rhs.size()) {return false;}
else
{
for (int i=0; i<lhs.size(); i++)
{
if (lhs(i)<rhs(i)) {return true;}
else if(lhs(i)>rhs(i)) {return false;}
}
}
}
};
然后
map<blitz::Array<int,1>,int, MyComparison> testmap;