2011-01-11 5 views
2

집합에 클래스를 넣을 수 있습니까? todos.insert이 경우의 (a)stl C++ : 집합의 클래스

class arco { 
    public: 
     arco(int x0, int y0, int z0, int x1, int y1, int z1); 
    private: 
     std::vector<int> a; 
     std::vector<int> b; 
     std::set< std::vector<int> > vertices; 
    }; 
    class arcos { 
    public: 
     arcos(); 
     void setArco(arco a); 
    private: 
     std::set<arco> todos; 
    }; 


    arco::arco(int x0, int y0, int z0, int x1, int y1, int z1){ 
    std::vector<int> a(3); 
    std::vector<int> b(3); 
    a[0]=x0; 
    a[1]=y0; 
    a[2]=z0; 
    b[0]=x1; 
    b[1]=y1; 
    b[2]=z1; 
    vertices.insert(a); 
    vertices.insert(b); 
    } 
    void arcos::setArco(arco a){ 
    todos.insert(a); 
    } 
+1

여기서 질문은 무엇입니까? 그것의 전체 명확하지 않습니다. –

+0

@ 마크 : 방금 말한 질문에 "나는 수업을 수업에 넣을 수 있니?" –

+0

@ 존 : 네, 좀 더 구체적인 것으로 보였습니다. 너무 일반적인 것처럼 보였습니다. :) –

답변

1

는 물론, 단지 class arco에 대한 operator< 과부하 또는 일부 비교기를 사용

편집 : 한 가지 방법 :

struct compare_arcos 
{ 
    bool operator()(const arco& a1, const arco& a2) const 
    { 
    //.. 
    } 
};

또는


    bool operator<(const arco& a1, const arco& a2) const 
    { 
    //.. 
    }

첫 번째 방법을 선택하면을 전달해야합니다. set


어의 인수로이 arcos::arcos(){std::set<arco> todos;} 완전히 쓸모가 .. 및

+0

예, 그는 토드 (todos)를 비공개 멤버로 만들고 싶었고 대신 컨스트럭터에 붙여 넣었습니다. –

+0

@ 유전자 - 사실, 그것은 개인,이 생성자에서 섀도우 멤버 것입니다 내 생각 엔 –

+0

괜찮아요, 줄을 삭제 arcos :: arcos() {std :: set todos;} – JuanPablo

1

잘못 당신은 그것을 set을 인스턴스화하기 위해 사용자의 유형에 대한 엄격한 약한 순서를 정의 할 필요가있다. operator< 또는 펑터가 될 수 있습니다.

편집 및 설명. set 선언은 이것이다 :

template < 
    class Key, 
    class Traits=less<Key>, 
    class Allocator=allocator<Key> 
> 
class set; 

KeyTraits, 당신의 비교 함수해야 당신의 유형 또는 operator<를 정의하면 기본적 allocator을 유지할 수 less<Key> 기본적를 유지할 수 있습니다.

+0

당신은 또한 당신의 학급을 <>보다 작게 전문화 할 수 있습니다. – etarion

1

예, 경고와 함께. 모든 STL 컨테이너

는 객체가 될 필요 포함 :

  • 복사 작도합니다. 복사 생성자를 제공하여이 작업을 수행 할 수 있습니다.
  • 할당 가능. 할당 연산자를 사용하여이를 수행 할 수 있습니다. operator=(const MyObject&)

또한 연관 컨테이너의 경우 포함 된 객체를 엄격하게 비교할 수 있어야합니다. 세트 자체는 less<key_type>을 사용하여이 비교의 기본 구현을 정의하지만 원하는 경우 사용자 정의 할 수 있습니다.

자주 비교할 기본값 인 less<key_type>을 사용합니다. 그렇게하면 bool operator<을 개체에 제공해야합니다. 클래스에 operator<을 제공 할 것을 요구하지 않는 엄격한 약한 비교 요구 사항을 충족하는 다른 성가신 방법이 있습니다.