Использование std::map с Eigen 3

В целях повышения эффективности мне нужно написать код, который берет вектор целых чисел, как определено в Eigen 3, VectorXi, и сопоставляет этот вектор с символом. Как словарь в Python. Как я могу это сделать? Документация Eigen делает все наоборот (см. ниже) - она ​​отображает символ в вектор. Я не могу заставить его работать в обратном направлении. Кто-нибудь когда-нибудь пробовал это раньше?

std::map<char,VectorXi, std::less<char>,
     Eigen::aligned_allocator<std::pair<char, VectorXi> > > poop;

VectorXi check(modes);
check << 0,2,0,0;
poop['a']=check;
cout << poop['a'];

person Jake Smith    schedule 20.11.2014    source источник
comment
Для начала вы, вероятно, захотите использовать unordered_map, если только вы не хотите определить функцию сортировки для VectorXi.   -  person user888379    schedule 20.11.2014


Ответы (1)


Ваш код пытается подойти к решению с совершенно противоположной стороны. Там вы строите карту, в которой ключи имеют тип char, а значения являются собственными векторами.

Обратите внимание, что в соответствии с домашней страницей Eigen настраиваемые распределители требуются только для < em>фиксированные версии собственных типов.

Чтобы использовать std::map с собственным вектором в качестве ключа, вам нужна соответствующая функция сравнения. Для этого вы можете специализировать std::less, который является разрешено для пользовательских типов. Вот возможная реализация:

namespace std
{
     template<>
     std::less<Eigen::VectorXi>(Eigen::VectorXi const& a, Eigen::VectorXi const& b)
     {
          assert(a.size()==b.size());
          for(size_t i=0;i<a.size();++i)
          {
               if(a[i]<b[i]) return true;
               if(a[i]>b[i]) return false;
          }
          return false;
     }
}

Тогда вы должны быть в состоянии написать

std::map<VectorXi, char> poop;

VectorXi check;
check << 0,2,0,0;
poop[check]='a';
cout << poop[check];  //prints 'a'

Однако приведенный выше код не проверен.

person davidhigh    schedule 21.11.2014
comment
Хорошо! Это именно то, что я искал. Мои векторы упорядочены лексикографически, поэтому неравенства должны быть определены немного по-другому, но я взял это отсюда. Спасибо бюстгальтер. - person Jake Smith; 21.11.2014
comment
Отлично. Но то, что я написал, это лексикографический порядок imo. - person davidhigh; 21.11.2014