2014-11-20 3 views
1

효율성을 높이기 위해 Eigen 3, VectorXi에 정의 된 정수 벡터를 사용하고 해당 벡터를 문자에 매핑하는 코드를 작성해야합니다. 파이썬의 사전과 같습니다. 어떻게해야합니까? Eigen 문서는 다른 방법으로 처리합니다 (아래 참조) - 문자를 벡터에 매핑합니다. 나는 그것을 역으로 작동시키지 못합니다. 아무도 이것을 전에 시도한 적이 있습니까?Eigen 3를 사용하여 std :: map 사용

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

먼저 VectorXi에 정렬 함수를 정의하지 않으려면 unordered_map을 사용하는 것이 좋습니다. – user888379

답변

1

코드가 완전히 반대쪽에서 솔루션에 접근하려고합니다. 여기서 키가 유형이 char이고 값이 고유 벡터 인 맵을 생성합니다.

Eigen homepage에 따라 사용자 지정 할당자는 고정 크기 버전의 Eigen 유형에만 필요합니다.

고유 벡터를 사용하여 std::map을 사용하려면 적절한 비교 함수가 필요합니다. 이를 위해 은 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

좋아요. 하지만 제가 작성한 것은 사전 편집 순서입니다. – davidhigh