2014-11-20 2 views
1

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

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']; 
+0

Для начала вы, вероятно, захотите использовать unordered_map, если вы не хотите определять функцию сортировки для VectorXi. – user888379

ответ

1

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

Обратите внимание, что в соответствии с Eigen homepage пользовательские распределители нужны только для фиксированных размеров версий типов Eigen.

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

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' 

Код выше не тестировался, однако.

+0

Хорошо! Это именно то, что я искал. Мои векторы упорядочены лексикографически, поэтому неравенства придется определять немного по-другому, но я получил это отсюда. Спасибо бюстгальтер –

+0

Изобразительное. Но то, что я написал, - это лексикографическое упорядочение imo. – davidhigh

Смежные вопросы