0

一般に、他の形式の配列よりも高いパフォーマンスを提供することを理解しているため、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;
4

1 に答える 1

3

std::mapドキュメントには、キーはデフォルトで を使用して比較されると記載std::lessされています。これはorを呼び出し<て、戻り値を期待するだけです。truefalse

Blitz 配列をキーとして使用するには、次のいずれかを行う必要があります。

  1. のような独自の比較関数を作成します。この関数は、std::less一方の 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
        }
    };
    
  2. 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;
于 2013-11-28T12:49:30.960 に答える