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: ошибка: невозможно преобразовать 'blitz::BzBinaryExprResult, blitz::Array >::T_result {aka blitz::_bz_ArrayExpr, blitz::FastArrayIterator, blitz:: Меньше> >} 'к' 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;
1 ответ
std::map
документация утверждает, что ключи сравниваются с помощью std::less
по умолчанию. Это просто звонки <
и ожидает возвращения true
или же false
,
Чтобы использовать блиц-массивы в качестве ключа, необходимо выполнить одно из следующих действий:
Создайте свою собственную функцию сравнения, например
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 } };
Оберните ваш тип массива 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;