使用std :: map和Eigen 3

时间:2014-11-20 19:44:05

标签: c++ eigen3

为了提高效率,我需要编写一个代码,该代码采用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'];

1 个答案:

答案 0 :(得分:1)

您的代码正试图从完全相反的方面接近解决方案。在那里,您构建了一个映射,其中键的类型为char,值为特征向量。

进一步注意,根据Eigen homepage自定义分配器仅需要固定大小版本的特征类型。

为了使用带有特征向量的std::map作为关键字,您需要一个适当的比较函数。为此,您可以将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'

然而,上面的代码未经测试。