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
станд :: меньше<_Tp> :: operator () (const _Tp&, const _Tp&) const [с _Tp =
блицкриг :: Массив]:

/usr/include/c++/4.6/bits/stl_function.h:236:22: ошибка: невозможно преобразовать
«Блицкриг :: BzBinaryExprResult,
блиц :: Array> :: T_result {aka
blitz :: _ bz_ArrayExpr, blitz :: FastArrayIterator, blitz :: Less>>} ’to
«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;

0

Решение

std::map документация утверждает, что ключи сравниваются с помощью std::less по умолчанию. Это просто звонки < и ожидает возвращения true или же false,

Чтобы использовать блиц-массивы в качестве ключа, необходимо выполнить одно из следующих действий:

  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;
3

Другие решения

Других решений пока нет …