두 벡터 내에서 동일한 객체 인스턴스 중 일부를 가진 두 개의 벡터 벡터와 일치하는 코드를 작성했습니다.두 벡터의 변수 매칭 및 효율적인 방법으로 비교지도 만들기
아이디어는 '기본'벡터에서 개체의 색인을 찾아 다른 벡터의 개체와 일치시키는 것입니다.
주 벡터의 색인은 해당 개체가있는지도에서 사용됩니다.
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와 사용할 수 없습니다) 또는 스마트 뭔가를 사용하여 위의 코드의 짧은/더 효율적인 방법이 있나요 ??
마이크
@perreal - 네 이것이 가능합니다. ;-디. 이러한 개체를 일치시키는 STL 효율성 솔루션에 대한 아이디어. 루프 솔루션은 추한 것입니다 ... – MWright
일반적인주의 사항 : 가능한 경우 C++에서 포인터가 아닌 참조로 객체를 전달해야합니다. 구문을 단순화하고 수신자가 라이프 사이클에 대한 책임을지지 않음을 분명히합니다. 또한 객체를 수정하지 않을 때마다 const를 사용해야합니다. 대부분의 C++ 라이브러리는 const 정확성을 위해 설계되었으며 객체를 const로 전달하므로 코드가 없이는 작동하지 않습니다. –
위의 예제에서 메소드는'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). –