我正在尝试使用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/bit/stl_ function .h:在成员函数‘bool std::less<_Tp>::operator()(const _Tp&,const _Tp&)中_Tp =blitz::_Tp&’: /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’
这是否需要<操作符的定义,如果是的话,我可以/应该自己定义它吗?
答案
正如吉米·汤普森所建议的,一个可能的解决办法是界定:
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;发布于 2013-11-28 12:49:30
std::map文档声明默认情况下使用std::less比较键。这只会调用<,并期望返回true或false。
为了将Blitz数组用作键,需要执行以下操作之一:
std::less,它返回一个布尔值,说明一个Blitz数组是否“小于”另一个Blitz数组(如何确定这取决于您)。假设您创建了这个函数并将其命名为MyComparison,那么您将创建您的映射,如下所示:map<blitz::Array<int,1>, int, MyComparison> testmap;。
struct MyComparison { bool运算符() (const blitz::Array &lhs,const blitz::Array &rhs) const { // Blitz数组比较};blitz::Array<int,1>)封装在另一个对象中,重载给定对象的<操作符,然后在其中执行比较。例如:
类MyArrayWrapper { blitz::Array内容;public: // Constructor等bool operator<(const MyArrayWrapper &rhs) const { // Blitz数组比较};然后在你现在的档案里。
std::map<MyArrayWrapper,int> testmap;https://stackoverflow.com/questions/20266266
复制相似问题