2013-08-12 1 views
1

많은 수의 픽셀을 정렬하려고합니다.매우 큰 사용자 정의 형식의 벡터를 정렬하는 방법

typedef char HexGetal; 
typedef unsigned int NatuurlijkGetal; 

struct Pixel{ 
    HexGetal Blue; 
    HexGetal Green; 
    HexGetal Red; 
}; 
struct Palet{ 
    Pixel Kleur; 
    NatuurlijkGetal Aantal; 
}; 
    vector <Palet> MyContainer; 

    NatuurlijkGetal Seeds[10]={1, 25, 55, 7, 3, 149, 6, 7, 1, 55}; 


    Palet LoopPalet; 


    LoopPalet.Kleur.Blue = 0; 
    LoopPalet.Kleur.Green = 0; 
    LoopPalet.Kleur.Red = 0; 


    for(NatuurlijkGetal Looper = 0; Looper < 10;Looper++) 
    { 
     LoopPalet.Aantal = Seeds[Looper]; 
     MyContainer.push_back(LoopPalet); 
    } 

"Palet"유형을 만든 후 "MyContainer"라는 Palet의 벡터를 만들고 초기화합니다.

이제 "Aantal"필드를 기준으로 정렬하고 싶습니다. 어떻게하면됩니까? 아마 2 가지 다른 방법을 찾고 있습니다.

파트 1 : 벡터가 작을 때이 작업을 수행하는 일반적인 방법을 배우고 싶습니다. 나는 결코 벡터를 분류하지 않았다. 그것에 대해 많이 읽고 비디오를 보았지만, 나는 그것을 얻지 못하고 있습니다.

파트 2 : 이 벡터는 사용될 때 나중에 100 만 개가 넘는 요소를 갖습니다. 복사 작업의 양을 제한하기 위해 더 똑똑한 접근이 필요합니다. 사전에

들으.

+5

맞춤형 비교기로'std :: sort'를 시도하십시오. 너무 느린 것으로 측정되면 다른 것을 조사하십시오. – chris

+0

나는 게시하기 전에 std :: sort를 시도했으나 작동하지 못했습니다.이 경우 사용자 지정 비교기가 어떻게 생겼는지 모르기 때문입니다. 내가 전에 그런 일을 한적 없다고 말했어. –

답변

3
struct mycomp 
{ 
    bool operator() (const Palet& p1, const Palet& p2) 
    { 
     return (p1.Aantal < p2.Aantal); //Change the operator as required 
    } 
}; 

std::sort(MyContainer.begin(), MyContainer.end() , mycomp()); 
+0

좋아요! 이 작동합니다. 고마워. –

+3

@MehmetElliyasa 안녕하세요, stackoverflow에 오신 것을 환영합니다. 그래서, 대답이 정확하거나 유용하다고 생각하면 그것을 upvote. SO의 질문은 질문의 대답뿐 아니라 유사한 질문을 검색하고 질문에 답한 모든 사람을 대상으로합니다. Upvotes는 좋은 답변과 그렇지 않은 것을 반영합니다. 마지막으로, 답이 자신의 문제를 해결했다고 생각하면 (이 경우와 마찬가지로) 질문에 대한 대답으로 표시하십시오 (답변의 초록색 표시). – Manu343726

+3

운영자는'const'이어야합니다. 비표준 라이브러리를 사용하려고 시도하면 일부 std 라이브러리 구현이 중단 될 수 있습니다. – juanchopanza

3

그냥 std::sort을 사용하십시오. 나는 2GB 프로세스 한계에 가깝게 달린 프로그램에서 사용 해왔다. "100 만개"의 요소는 아마도 많이 들리 겠지만 8 바이트는 여전히 8MB에 불과합니다. 캐시에 맞을 수도 있습니다.

1

나는 개인적으로 std::sort 또는 유사한을 사용하는 것입니다,하지만 난 std::vector에 직접 큰 요소를 정렬되지 않습니다. 비교자를 사용하여 큰 요소에 대한 참조를 정렬합니다. 각 참조는 큰 요소에 대한 스마트 포인터가있는 간단한 컨테이너입니다.

또한 std::map을 자동으로 정렬 된 순서로 제공하는 컨테이너로 생각할 수 있습니다.

+1

-1'std :: sort'는 벡터를 정렬 할뿐만 아니라 dessigned됩니다. iterator 패턴을 사용하여 dessigned된다. 즉, 초기 iterator와 최종 iterator에 의해 정의 된 간격을 정렬한다. 비 std :: vector 컨테이너에서'begin()'과'end()'iterator를 정의하면'std :: sort'와 함께 사용할 수 있습니다. – Manu343726

+1

미안하지만 당신이 그 생각을 이해하지 못했다고 생각합니다. std :: vector를 사용자 정의 컨테이너로 바꾸라고 제안하지 않았습니다. 컨테이너의 큰 요소에 대한 참조를 래핑하고 참조를 정렬하도록 제안했습니다. – Karadur

+1

큰 데이터 클래스를 움직일 수 있으면 랩핑이 필요하지 않습니다. 이동은 저렴합니다. 물론 C++ 11 기능에 액세스 할 수 있다면. – Manu343726

관련 문제