2011-01-05 8 views

답변

33
std::vector<std::pair<std::string, bool> > v; 
std::sort(v.begin(), v.end()); 

std::pair 과부하 operator<second 요소가 그 요소에 의해 제 first 정렬한다. 따라서 기본 정렬 순서 (operator<)를 사용하여 vector을 정렬하면 원하는 순서대로 정렬됩니다.

+1

이것은 C++ 0x 전용 답변입니다. ;) 편집 : 두 개의 중첩 된 템플릿'<>'쌍을 닫는 토큰 ('''토큰은 C++ 0x 전용입니다.)이 수정되었습니다. –

+0

@Charles : 하! 네, 아마도 많은 답변에서 그렇게하겠습니다. 나는'>>'을 지원하는 컴파일러를 사용하는 데 익숙하다. –

+4

+1 :'std :: pair :: operator <()'에 과부하가 걸렸다는 것을 몰랐습니다. 지금 할게! –

0

맞춤형 비교기를 사용하여 '.first'쌍만 주문할 수 있습니다.

sort(begin, end, 
    compose2(less<string>(), 
       select1st<pair<string, bool> >(), 
       select1st<pair<string, bool> >())); 
+2

'select1st'는 C++ 표준 라이브러리의 일부가 아닙니다. –

+0

음. 다행스럽게도 다음과 같이 쓰는 것이 쉽습니다 :'template struct select1st : public unary_function {const typename T :: first_type & operator() (const T & x) const {return x.first;}};' – ephemient

2

정말 제임스의 대답과 같은 I, 그러나 당신이 고려하는 것이 좋습니다 다른 하나의 옵션이있다 - 단지 std::map에 모든 것을 깔때기 : 중복 문자열이있는 경우,

std::map<std::string, bool> myMap(v.begin(), v.end()); 

또는이하는 std::multimap :

std::multimap<std::string, bool> myMultiMap(v.begin(), v.end()); 

이것은을 위해 (N) O는 달리, 당신은 다음 추가하거나 새로운 키/값 쌍을 제거해야하는 경우, 당신은 O (LG 전자 N)에 그렇게 할 수있는 추가 이점을 가지고있다 정렬 된 벡터입니다.

정말로 벡터를 사용해야하는 경우 James의 대답을 참조하십시오. 그러나 쌍의 벡터가있는 경우 실제로는 std::map이 필요합니다.

+0

사용자가 정렬하고 싶지 않은 순서와 정렬 순서를 고려해야합니다. – jmasterx

+1

벡터 + 정렬은 big-O 표기법이 무엇을 말하는지와 상관없이 실제로는 (멀티) 맵에 많은 내용을 삽입하는 것보다 훨씬 빠릅니다. – Reunanen

관련 문제