2013-11-28 3 views
0

일반적으로 다른 형식의 배열보다 높은 성능을 제공하므로 blitz ++ 배열을 사용하려고합니다. blitz ++ 배열을지도의 키로 사용할 수 있습니까? 시도 중지도 용 키로 Blitz ++ 배열

컴파일되지 않습니다.

In file included from /usr/include/c++/4.6/string:50:0,

/usr/include/c++/4.6/bits/stl_function.h: In member function ‘bool std::less<_Tp>::operator()(const _Tp&, const _Tp&) const [with _Tp = blitz::Array]’:

/usr/include/c++/4.6/bits/stl_function.h:236:22: error: cannot convert ‘blitz::BzBinaryExprResult, blitz::Array >::T_result {aka blitz::_bz_ArrayExpr, blitz::FastArrayIterator, blitz::Less > >}’ to ‘bool’ in return

< 운영자의 정의를 필요로하는 문제는 이것이다, 그렇다면,/내가 직접 정의해야 할 수 있습니다 여기에 오류가있어? 키가 std::less을 사용하여 비교하는 std::map 문서 상태이어서

struct MyComparison 
{ 
bool operator() (const blitz::Array<int, 1> &lhs, const blitz::Array<int, 1> &rhs) const 
    { 
     if (lhs.size() < rhs.size()) {return true;} 
     else if (lhs.size() > rhs.size()) {return false;} 
    else 
     { 
     for (int i=0; i<lhs.size(); i++) 
      { 
      if (lhs(i)<rhs(i)) {return true;} 
      else if(lhs(i)>rhs(i)) {return false;} 
      } 
     } 
    } 
}; 

map<blitz::Array<int,1>,int, MyComparison> testmap; 
+0

"작동하지 않는다"고 말하면 작동하지 않는다고 말하는 것이 매우 중요합니다. –

+0

컴파일러 오류에서 편집했습니다. 나는 정말로 그것이 무엇을 의미하는지에 관해 모른다. – RobVerheyen

+0

당신 말이 맞아요. 네임 스페이스 표준을 편집했습니다. – RobVerheyen

답변

3

:

지미 톰슨 의해 제안

, 가능한 솔루션을 정의하는 것 태만. 방금 <이 호출되며 true 또는 false이 반환 될 것으로 예상됩니다. 하나의 기습 여부를 알리는 부울 값을 반환하는 std::less처럼, 자신의 비교 함수를 만듭니다

  1. :

    당신 키로 전격 배열을 사용하기 위해서는

    , 다음 중 하나를 수행해야 배열이 다른 배열보다 적습니다 (어떻게 결정할 지 결정하는 방법은 당신에게 달려 있습니다). 이 함수를 작성하여 MyComparison이라고 가정하면 map<blitz::Array<int,1>, int, MyComparison> testmap;과 같이 맵을 작성합니다.

    struct MyComparison 
    { 
        bool operator() (const blitz::Array<int, 1> &lhs, const blitz::Array<int, 1> &rhs) const 
        { 
         // Blitz array comparison 
        } 
    }; 
    
  2. 는 지정된 객체의 < 연산자 과부하하고 거기에서 비교를 수행하는 또 다른 목적에 전격 어레이 타입 (blitz::Array<int,1>)를 감싸. 현재 파일에서 다음

    class MyArrayWrapper 
    { 
        blitz::Array<int, 1> contents; 
    
    public: 
        // Constructor, etc. 
    
        bool operator<(const MyArrayWrapper &rhs) const 
        { 
         // Blitz array comparison 
        } 
    }; 
    

예를 들면 다음과 같습니다.

std::map<MyArrayWrapper,int> testmap; 
+0

정교한 답변에 감사드립니다. 가장 가벼운 솔루션 인 것처럼 보이기 때문에 버전 1을 선택했습니다. 내 솔루션을 질문에 편집 할 것입니다. Blitz ++ 설명서에서 stl 스타일 반복기를 사용하는 방법이 표시되지 않으므로 내 솔루션이 가장 효율적이지 않을 수 있습니다. 구현은 사전 편집입니다. 더 효율적인 방법을 찾으면 알고 싶습니다. – RobVerheyen