Blitz ++ массивы в качестве ключей для карт

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 [с _Tp = blitz :: Array ]:

/usr/include/c++/4.6/bits/stl_function.h:236:22: error: невозможно преобразовать 'blitz :: BzBinaryExprResult, blitz :: Array> :: T_result {aka blitz :: _ bz_ArrayExpr, blitz :: FastArrayIterator, blitz :: Less>>} to 'bool in return

Требуется ли определение оператора < operator>, и если да, я могу/должен сам его определить?

ОТВЕТ

Как было предложено Джимми Томпсоном, возможным решением является определение:

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
    Когда вы говорите, что это «не работает», очень важно сказать, как это не работает.
  • 0
    Я отредактировал ошибку компилятора. Я действительно не знаю, что это значит, хотя.
Показать ещё 1 комментарий
Теги:
stl
blitz++

1 ответ

3
Лучший ответ

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

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

  1. Создайте свою собственную функцию сравнения, например std::less, которая возвращает логическое значение, указывающее, является ли один массив Блица "меньше", чем другой (как вы решили определить, что это зависит от вас). Предполагая, что вы сделали эту функцию и назвали ее 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::Array<int,1>) в другом объекте, перегружая оператор < this для данного объекта, а затем выполняйте сравнение. Например:

    class MyArrayWrapper
    {
        blitz::Array<int, 1> contents;
    
    public:
        // Constructor, etc.
    
        bool operator<(const MyArrayWrapper &rhs) const
        {
            // Blitz array comparison
        }
    };
    

Затем в вашем текущем файле.

    std::map<MyArrayWrapper,int> testmap;
  • 0
    Спасибо за подробный ответ. Я выбрал версию 1, так как она кажется наиболее легким решением. Я отредактирую свое решение в вопросе. Я не вижу, как использовать итератор в стиле stl в документации Blitz ++, поэтому мое решение может быть не самым эффективным. Реализация лексикографическая. Если вы видите какой-либо способ сделать его более эффективным, я хотел бы знать.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню