2014-04-25 1 views
1

최근에는 언어를 배우는 방법으로 최근에 종료 된 topcoder.com 대회에 C++ 솔루션을 시도하기로 결정했습니다. 그러나, std :: set 객체를 통한 반복 작업이 set의 모든 요소 (set.count> # 요소가 통과 함)에 성공적으로 도달하지 못했을 때 나는 혼란스러워졌습니다. 나는 StackExchange와 다른 곳에서 이것을 경험 한 다른 사람들을 찾아 헤매고있다.C++ 반복자가 집합의 끝에 도달하지 않도록 설정합니다.

세부 사항은

나는 페이스트 빈하는 코드를 게시 한 : http://pastebin.com/U7xQzDQg.

내가 시도한 것은 순진한 클러스터링 알고리즘입니다. 내가하고 싶은 것을 성취 할 수있는 더 좋은 방법이 있다고 확신합니다. 그러나 이것은이 단계에서 관심이 없습니다 (제 초점은 언어와 특질을 배우는 데 있습니다). 나는 "x"와 "y"속성을 가진 Position 객체에 의해 데카르트 격자에서 사각형을 표현합니다. 반복적 인 방법을 사용하여 전체 그리드를 스캔하여 동일한 색상의 오브젝트를 찾고이를 클러스터 오브젝트로 그룹화합니다. 알고리즘이 완료되면 일련의 클러스터가 생성되며 각 클러스터에는 설정된 거리보다 많은 간격을 둔 Position 오브젝트 세트가 포함됩니다. 알고리즘 중 어떤 시점에서 서로 가까이있는 클러스터를 병합해야합니다. 그것은 내가 문제를 가지고있는 곳입니다. 내 코드가 제대로 작동 된 경우

가, 마지막 줄에 표시해야합니까
TO MERGE: 
Cluster of size 1: [1,1], 
Cluster of size 2: [0,1], [0,2], 
MERGED: 0x7fffb5e9b970Cluster of size 3: [0,1], [1,1], 

입니다 :

컴파일 및 페이스트 빈에 게시 된 코드를 실행하면

, 다음과 같은 메시지를 볼 수

MERGED: <Memory Address of Cluster>Cluster of size 3: [0,1], [1,1], [0,2], 

이러한 행은 병합을 시도 할 때마다 생성됩니다 (54 행 참조). 표준 집합 반복을 사용하여 연산자 캐스팅 메소드 (97 줄 참조)에 의해 생성 된 클러스터 객체의 문자열 표현을 사용합니다.

집합의 요소 수가 적지 만 집합을 반복하면 모든 집합에 도달하지 않는다는 것이 확실합니다. 나는 그것이 범위를 벗어나 파괴되는 물체에 문제가 될 것이라고 생각했다; 그러나 std :: set 객체는 데이터 구조에 요소를 삽입하기 전에 요소를 복사하므로 (다른 방법으로 제안 된 Position 요소의 소멸자를 사용하여 테스트해야 함)이 경우에는 해당되지 않습니다.

나는 정말 상실감이 있으며 주위를 해킹하고 싶지 않습니다 ... 왜냐하면 내가 여기서 누락 된 중요한 것이 있다고 생각하기 때문입니다. 누구든지 나를 도울 수 있습니까? 당신의 output 문자열이 범위를 벗어나 및 기본 문자 배열이 때 함수가 반환을 삭제 되었기 때문에

최저

, 마태 복음

답변

1

operator<Position 개체에 대해 strict weak ordering을 유발하지 않으므로 프로그램에서 정의되지 않은 동작을 보입니다. 귀하의 코멘트에 대한

bool operator< (Position other) const { 
    if (y < other.y) return true; 
    if (y > other.y) return false; 
    return x < other.x; 
} 
1

return output.c_str(); 

은 정의되지 않은 동작입니다.

귀하의 operator const char*() const 기능은 아마 std::cout에 직접 기록하는

friend std::ostream& operator<<(std::ostream&, Cluster const&) 

기능이 있어야한다.

당신도 calloc ed를 가지고 있거나 더 많이 힙에 물건을 할당하지 마십시오.

+0

감사 :

bool operator< (Position other) const { return other.x - x + 100*(other.y - y); } 

당신은 대신를 사용할 수 있습니다. 나는 다양한 기억 문제 (이 것 같음)를 알고 있었지만, 나는 그들이 내가 언급 한 문제에 영향을 미쳤다고 생각하지 않았다. 내가 가진 문제는 Oktalist에 의해 해결되었습니다. 하지만 나는 보드에 당신의 의견도 가지고 갈 것입니다 :). – Matthew

관련 문제