2014-11-20 136 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 2014-11-20 20:04:00

回答

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' 

上面的代码是未经测试,但是。

+0

好吧!这正是我所期待的。我的向量按照字典顺序排列,所以不平等必须有一些不同,但我从这里得到了它。谢谢胸罩。 – 2014-11-21 17:25:38

+0

好。但我写的是词典排序imo。 – davidhigh 2014-11-21 20:54:17