2013-03-22 4 views
0

std::vectors 사이의 차이를 얻는 효율적인 방법을 찾고 있습니다. 포함 된 객체에는 자연 순서가 없습니다. 내가 할 수있는 최선은 평등을 시험하는 것입니다. 이것은 std::set_difference 옵션을 배제하는 것으로 보입니다.자연 정렬 순서가없는 두 표준 :: 벡터의 차이

두 개의 중첩 된 반복기 안의 개체를 비교하는 것보다 나은 해결책이 있습니까?

+0

벡터의 크기는 어느 정도입니까? –

+0

최악의 경우 각 요소에는 최대 7000 개의 요소가있을 수 있습니다. – Dunnie

+3

인위적으로 일관된 주문을 부과 할 수있는 한 * 자연 * 주문이 필요하지 않습니다. 그것은 의미가 없어도 엄격한 약한 순서에 대한 기준을 만족시킵니다. –

답변

0

가능한 목표는 가능한 긍정적 인 일치를 그룹화하여 동등성 테스트의 수를 줄이는 것입니다.

내가 생각할 수있는 가장 좋은 점은 첫 번째 벡터로 해시 맵을 작성한 다음 해시 맵에서 두 번째 벡터의 모든 요소를 ​​빼는 것입니다. 즉, 요소에 알맞은 해시 함수를 찾아야합니다.

당신이 포인터를 저장하고 동등한 조건부가 그것을 기반으로한다면, 당신은 해시를 그 포인터 적분 값에 기초 할 수 있습니다.

What is a good hash function?을 참조하십시오.

주석에서 언급했듯이 다른 대안은 요소의 특정 속성에 대한 순서를 설정하고이를 사용하여 평등의 가능성을 줄이는 것입니다. 두 벡터를 먼저 정렬해야 할 수 있습니다.

+0

내 대답은 매우 언어에 구애받지 않습니다. 나는 어떤 솔루션이 더 나은 성능을 보여줄지 알 수 없다. – didierc

0

벡터의 속성을 활용할 수 있습니다. 연속 된 메모리 할당이 있습니다. 즉, 벡터가 하나의 큰 메모리 공간을 예약하고 (더 크고 일반적으로 사용됨) 환상적인 최적화 없이는 메모리 공간을 직접 비교할 수 있습니다. .

C++ 0x에는 해당 메모리 공간의 시작 부분에 직접 액세스 할 수있는 data() 메서드가 있습니다. memcmp을 사용하면 벡터 내부의 모든 데이터를 비교할 수 있습니다.

std::vector<char> vector_1; 
std::vector<char> vector_2; 

// data in to vector_1 
// data in to vector_2 

if(!memcmp(vector1.data(),vector_2.data(),SIZE_OF_BUFFER_TO_COMPARE)) 
{ 
    std::cout <<< "equal vectors" << std::endl; 
} 
+0

오히려 무언가 :'std :: equal_range'는'std :: vector'뿐만 아니라'std :: list'에서도 작동합니다. 더 중요한 것은, 당신은 요점을 놓친다. 2 개의 벡터는 서로 다른 순서로 요소를 가질 수 있습니다. – MSalters