我正在尝试使用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比较密钥。这仅调用<,并期望返回truefalse

为了使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;

10-08 08:56