2012-03-02 2 views
0

두 벡터 내에서 동일한 객체 인스턴스 중 일부를 가진 두 개의 벡터 벡터와 일치하는 코드를 작성했습니다.두 벡터의 변수 매칭 및 효율적인 방법으로 비교지도 만들기

아이디어는 '기본'벡터에서 개체의 색인을 찾아 다른 벡터의 개체와 일치시키는 것입니다.

주 벡터의 색인은 해당 개체가있는지도에서 사용됩니다.

ifndef OBJECTMAPMATCH_H 
#define OBJECTMAPMATCH_H 

#include <map> 
#include <utility> 
#include <vector> 
#include <typeinfo> 
#include <iostream> 
#include <stdlib.h> 

namespace ObjectMapMatch { 

    ... 
    ... 
    template< class A, class B > 
    std::map<int, B*>* getIndexMap(std::vector<A*>* x , std::vector<B*>* y, std::map<int, B*>* output) 
    { 
     typename std::vector<A*>::iterator Aitr = x->begin(); 
     typename std::vector<A*>::iterator AitrE = x->end(); 
     typename std::vector<B*>::iterator Bitr = y->begin(); 
     typename std::vector<B*>::iterator BitrE = y->end(); 

     for(int index=0; Aitr!=AitrE; ++Aitr, ++index){ 
     //Keep track of original index 
     int AntupIndex = (*Aitr)->Index(); 
     int match = false; 

     for(; Bitr!=BitrE; ++Bitr){ 
      int BntupIndex = (*Bitr)->Index(); 

      if(AntupIndex == BntupIndex){ 
       match = true; 
       output[index] = (*Bitr); 
      } 
      } //End of loop B 

      if(!match){ 
      std::cout << "ERROR:ObjectMapMatch::getIndexMap: Can not Find Match" << typeid(y).name() << " FOR " << typeid(x).name() << std::endl; 
      exit(1); 
      } 

      }//End of Loop A 

      } 

    ... 
    ... 
} 
#endif 

당신은 내가 거기에 기본적으로 고유 인덱스로 두 개체를 비교하고이 일치하는 경우 개체가 일치합니다 볼 수 있듯이 :

나는 코드를 보는 것은 나의 설명이 좀 명확하게 할 수있다 생각합니다.

내 quesitons :

내가 객체 클래스의 비교 연산자를 오버로드 할 수 알지만, 이런 일이 올 것 만약 내가 확실하지 않았다? 또한

bool operator==(object1& lhs, object2& rhs){ 
    &lhs == &rhs ? return true : return false; 
} 

,

는 일부 STL 알고리즘 (부스트 libs와 사용할 수 없습니다) 또는 스마트 뭔가를 사용하여 위의 코드의 짧은/더 효율적인 방법이 있나요 ??

마이크

+0

@perreal - 네 이것이 가능합니다. ;-디. 이러한 개체를 일치시키는 STL 효율성 솔루션에 대한 아이디어. 루프 솔루션은 추한 것입니다 ... – MWright

+0

일반적인주의 사항 : 가능한 경우 C++에서 포인터가 아닌 참조로 객체를 전달해야합니다. 구문을 단순화하고 수신자가 라이프 사이클에 대한 책임을지지 않음을 분명히합니다. 또한 객체를 수정하지 않을 때마다 const를 사용해야합니다. 대부분의 C++ 라이브러리는 const 정확성을 위해 설계되었으며 객체를 const로 전달하므로 코드가 없이는 작동하지 않습니다. –

+0

위의 예제에서 메소드는'std :: map const & getIndexMap (std :: vector const & x, std :: vector const & y, std :: map & 출력)'연산자 여야합니다. 'bool operator == (object1 const & lhs, object2 const & rhs)'가됩니다. 표준 라이브러리가 const 참조에서 호출하기 때문에 나중에 const가 아닌 연산자를 사용하는 연산자가 일치하지 않기 때문입니다. 물론'연산자'==는'Index' 메쏘드가'const' 수식 자로 정의되지 않으면 컴파일되지 않습니다 (invocant가 인수 목록을 뒤 따르는 const). –

답변

2

가지 방법의 커플 O (N^2)보다 더 효율적으로이 작업을 수행 할 수 있습니다. 예를 들어

: 첫 번째 벡터

  • 정렬 소자.
  • 두 번째 벡터의 요소를 정렬합니다.
  • 정렬 된 벡터에 set_intersection을 사용하십시오.

또는 : multiset (또는 unordered_multiset)에 모두 벡터의

  • 넣어 요소.
  • 의 키가 이 넘고 요소가 일치하는 것을 나타냅니다.

두 가지 방법 모두 실제 요소 대신 원본 벡터에서 포인터 또는 인덱스를 사용할 수 있습니다. 포인터/인덱스를 처리 할 수있는 비교 자 (sort, set_intersectionmultiset)를 제공하는 데주의하십시오.

+0

두 벡터가 같은 조건으로 정렬됩니다. 어떻게 set_intersection 벡터 내지도 [int, B] 인덱스를 저장하려면 원하는대로 내 문제가 작동하는지 잘 모르겠습니다. 이것은 벡터 A의 어떤 객체 번호가 벡터 B의 객체를 가리키는 지 알기 때문입니다. 명확하지 않은 경우 미안합니다 – MWright

+0

코딩 된 예제를 제공 할 수 있다고 오해 한 경우? – MWright

+1

@MWright : 정렬 된 구조에 인덱스를 써야 할 것보다 많습니다. 그러나 나는 인덱스가 필요하다는 것이 콜 체인 (call chain)의 어딘가에서 차선책의 징조라고 생각한다. 실제로 차선의 데이터 구조를 사용하는 것처럼 보이는 모든 문제가 발생합니다. –

관련 문제