我正在尝试使用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 :: operator()(const _Tp&,const _Tp&)const [with _Tp =
blitz :: Array]’:
/usr/include/c++/4.6/bits/stl_function.h:236:22:错误:无法转换
‘blitz :: BzBinaryExprResult,
闪电战::: Array> :: T_result {aka
blitz :: _ bz_ArrayExpr,blitz :: FastArrayIterator,blitz :: Less>>}’到
作为回报的“布尔”
这是否是需要定义
<
运算符的问题,如果需要,我可以/应该自己定义它吗?回答
正如吉米·汤普森(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;
最佳答案
std::map
文档指出默认情况下使用std::less
比较密钥。这仅调用<
,并期望返回true
或false
。
为了使Blitz数组用作键,您需要执行以下操作之一:
创建自己的比较函数,例如std::less
,该函数返回一个布尔值,该布尔值说明一个Blitz数组是否比另一个Blitz数组“小”(如何选择确定是否由您自己决定)。假设您已创建此函数并将其命名为MyComparison
,则可以按map<blitz::Array<int,1>, int, MyComparison> testmap;
的方式创建地图。
struct MyComparison
{
bool operator() (const blitz::Array<int, 1> &lhs, const blitz::Array<int, 1> &rhs) const
{
// Blitz array comparison
}
};
将Blitz数组类型(
blitz::Array<int,1>
)包装在另一个对象中,使该给定对象的<
运算符重载,然后在其中执行比较。例如:class MyArrayWrapper
{
blitz::Array<int, 1> contents;
public:
// Constructor, etc.
bool operator<(const MyArrayWrapper &rhs) const
{
// Blitz array comparison
}
};
然后在当前文件中。
std::map<MyArrayWrapper,int> testmap;