2013-06-14 2 views
2

두 세트의 사중주 (내가 정의한 클래스)를 병합하려고합니다.C++에서 병합 집합, 연산자 오버로드

병합에 들어가기 전에 연산자 오버로딩에 대한 질문을하겠습니다. 수업 운영자에게 과부하를 걸려면 클래스 내에서나 클래스 외부에서 차이를 만들 수 있습니까? 예를 들어 I 클래스 내에서 그것을 한 경우, 제 기능 헤더는

bool quartet::operator<(const quartet& other) 

것하지만 클래스의 외부를 한 경우에, 제 기능 헤더 봤는데

bool operator<(const quartet& one, const quartet& two); 

것 나는이 글을 쓰는 시점에 그것을 복제 할 수는 없지만, 한 곳에서 어떤 오류를 없애고 다른 곳에서 오류를 제거했다고 믿기 때문에이 두 곳을 전환했다.

이제 정상적으로 병합됩니다. 는 현재 다음과 같은 코드가 작동 (A, B, C 및 D는 상기에서 정의 된 경우, 그리고 ==의 C)

set<quartet> Qset; 
    set<quartet> result; 
    Qset.insert(A); 
    Qset.insert(B); 
    set<quartet> Qset2; 
    Qset2.insert(C); 
    Qset2.insert(D); 
    merge(Qset.begin(), Qset.end(), Qset2.begin(), Qset2.end(), inserter(result, result.end())); 
    printSet(result); 

그래서, 내 첫 번째 질문은, 내가 병합의 마지막 매개 변수를 변경하는 경우 나는이 오류가 이유는 무엇입니까

/usr/include/c++/4.6/bits/stl_algobase.h:299:6: error: passing ‘const quartet’ as ‘this’ argument of ‘quartet& quartet::operator=(const quartet&)’ discards qualifiers [-fpermissive] 
make: *** [quartet.o] Error 1 

: result.begin()-inserter(result, result.end())에서, 나는 컴파일러 오류가? 내 이해는 병합의 마지막 매개 변수가 요소를 병합해야하는 위치에 반복자를 사용하므로 왜 result.begin()이되지 않을까요? 게다가, 정확하게 삽입 기는 무엇입니까?

더 일반적으로, 나는 결국 큰 정렬 된 세트로 작업하게 될 것입니다. 병합을 호출하거나 set_union을 호출하는 것이 더 빠릅니까? 둘의 차이점은 무엇입니까?

마지막으로 set2.insert (set1.begin(), set1.end())를 호출하여 두 세트를 병합 할 수 없습니까? 당신이 당신의 < 운영자가 클래스를 수정하지 않는 컴파일러에게 필요가 있기 때문에 당신은 그 오류를 받고있어

+0

"수업 운영자에게 과부하를 걸려면 수업 내에서 또는 수업 외부에서 차이를 만드나요?" 이전 (클래스 내)은 일반적으로 더 짧기 때문에 선호되는데, 그 행동이 클래스에 묶여 있음을 강조합니다. –

+0

@ slavik262 - 누구에게 "일반적으로 선호"인가? C++ 세계의 일부 타격이 심한 타자들은 비회원이 아닌 친구의 기능을 선호한다고 말합니다 (http://stackoverflow.com/questions/5989734/). – Nemo

+0

나는 고쳐졌다. –

답변

1

감사합니다. 그냥 잘 작동하는 것처럼

bool quartet::operator<(const quartet& other) const 

는 또한 set2.insert(set1.begin(), set1.end()) 보인다 : 당신은 const로 멤버 함수를 선언함으로써 그렇게.

2

클래스 내부 및 외부의 C++에있는 오버로드 연산자를 선언하는 것과 호출의 의미 및 객체의 순서에 따라 달라집니다.

이 호출은 가장 왼쪽의 개체가 4 중 형식이어야합니다.

bool quartet::operator<(const quartet& other) 

이 호출 중에는 자동 유형 변환을 통해 4 중창으로 변환 할 수있는 모든 것을 허용하십시오.

bool operator<(const quartet& one, const quartet& two); 

당신이 < 연산자 클래스를 수정할 수 없음을 지정해야하기 때문에, 당신이 그것을 받고있어 오류와 관련된 두 번째 질문으로

C++ overloading conversion operator for custom type to std::string를 참조하십시오.당신은 CONST로 기능을 지정해야합니다

bool quartet::operator<(const quartet& other) const 

을하고,이 두 세트를 병합 insert를 사용할 수 있습니다.