2010-12-02 2 views
0

현재 입력 파일에서 정보를 읽습니다. 그 정보 중 이름이 있습니다. 모든 정보는 struct로 읽혀집니다. 이러한 구조체 배열이 있습니다.C++ - 문자열 알파벳

이진 검색 트리를 사용하여 구조체를 성으로 알파벳순으로 정렬해야합니다.

==, < 및>에 대한 연산자 오버로드 함수를 작성해야합니까? 그렇다면 누군가 내가 그 일을 시작하도록 도울 수 있습니까?

+2

:::::: 숙제? – wilhelmtell

+0

먼저 이진 트리를 작성해야합니까? – wilhelmtell

+0

바이너리 트리 클래스를 이미 작성했습니다 ...연산자 오버로드에 대해 혼란스러워합니다. – Johnrad

답변

0

연산자 오버로드는 함수 나 메서드처럼 작동합니다. 그들은 같은 방식으로 리턴 타입과 인자를 얻는다. 예를 들어, 이진 연산자 (예 : <)는 하나의 인수가있는 멤버 함수이거나 연산자가 양쪽에 각각 2 개인 자유 함수입니다. 유일한 다른 점은 식별자 함수 이름을 갖는 대신 특수 구문 인 키워드 operator과 연산자가 오버로드 된 것입니다. 따라서 비교 가능한 유형을 원한다면 다음과 같이 할 수 있습니다.

class MyUserType 
{ 
    private: 
    std::string sort_significant; 
    std::string sort_insignificant; 
    public: 
    bool operator<(const MyUserType &) const; 
}; 

bool MyUserType::operator<(const MyUserType & other) const 
{ 
    return sort_significant < other.sort_significant; 
} 
+0

당신은'const MyUserType &'을 의미합니다. – wilhelmtell

+0

나는 그것을 의미한다. – SingleNegationElimination

1

예, == 및 <에 대한 연산자 오버로드를 작성하려고합니다. (> 필요하지, 그냥 예를 들어 if (a < b) 확인 후 else 케이스를 사용합니다. else if (a == b)을) 우리의 경우

를 하나의 구조체는 우리가 성을 기준으로 알파벳순으로되어 있기 때문에 "보다"경우에만 마지막 이름을 다른 다른 사람의 성을 알파벳 순서로 사용합니다.

그래서 정확히 무엇이 문제입니까? 연산자 오버로드를 작성하는 방법을 알고 있습니까? 문자열을 비교하고 알파벳순으로 먼저 오는 것을 판별하는 방법을 알고 있습니까?

+0

연산자 오버로드를 작성하는 데 도움이 필요합니다. 네가 그걸 도와 줄 수 있다면 정말 대단 할거야. – Johnrad

1

구조체의 두 인스턴스를 비교하는 방법이 필요합니다. 비교 연산자 (예 : operator<())를 작성하는 것이 편리 할 수 ​​있습니다.

class Record { 
    friend bool operator<(const Record&, const Record&); 
    std::string name; 
    // ... 
}; 

bool operator<(const Record& a, const Record& b) 
{ 
    // return true if the name of a is less than the name of b 
} 

노드가 왼쪽 하위 트리 또는 당신은 단지 노드인지 알 필요가 오른쪽 하위 트리에 하나 삽입하기 때문에 다른 노드 "보다". 그렇지 않은 경우 다른 노드보다 크거나 크거나 상관 없습니다. 어느 쪽이든 다른 하위 트리로 이동합니다.

물론 다른 작업에서는 동일성 비교가 필요할 수 있습니다. 그렇다면 모든 방법을 사용하여 불평등 연산자를 제공하는 것이 좋습니다.

또한 rel_ops 네임 스페이스에 관심이 있습니다.

0

일반적으로 <을 오버로드해야하지만, 구조체에 다른 요소가 있으면 언젠가 정렬 할 수도 있습니다. 실제로 그렇게하는 것이 의미가 없습니다. 구조체의 두 매개 변수를 허용하는 별도의 함수를 작성하여 성으로 비교하고 첫 번째가 두 번째 앞에 오면 참을 리턴하고 그렇지 않으면 거짓을 리턴해야합니다. 그런 다음 해당 함수를 std :: sort에 전달합니다. 이런 식으로 뭔가가 :

bool compare_by_last_name(const MyStruct & lhs, const MyStruct & rhs) 
{ 
    return lhs.last_name < rhs.last_name; 
} 

// later 

vector<MyStruct> v; 

// put some elements in v 

std::sort(v.begin(), v.end(), compare_by_last_name); 

당신은 내가 매우 당신이 무슨 뜻인지 모르기 때문에 내가 당신의 문 "이진 검색 트리를 사용"무시 한 알 것이다, 그러나 아마 무관합니다. 너 자신의 컨테이너 수업이나 뭐 만들었 니?