vector
을 pair.first
인 std::string
과 비교하면 어떻게 분류 할 수 있습니까? (정적 비교 기능을 제공하지 않고 부스트를 사용하지 않음).std :: vector <std :: pair <std :: string, bool >>을 문자열로 정렬 하시겠습니까?
답변
std::vector<std::pair<std::string, bool> > v;
std::sort(v.begin(), v.end());
std::pair
과부하 operator<
는 second
요소가 그 요소에 의해 제 first
정렬한다. 따라서 기본 정렬 순서 (operator<
)를 사용하여 vector
을 정렬하면 원하는 순서대로 정렬됩니다.
맞춤형 비교기를 사용하여 '.first
'쌍만 주문할 수 있습니다.
sort(begin, end,
compose2(less<string>(),
select1st<pair<string, bool> >(),
select1st<pair<string, bool> >()));
'select1st'는 C++ 표준 라이브러리의 일부가 아닙니다. –
음. 다행스럽게도 다음과 같이 쓰는 것이 쉽습니다 :'template
정말 제임스의 대답과 같은 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
이 필요합니다.
이것은 C++ 0x 전용 답변입니다. ;) 편집 : 두 개의 중첩 된 템플릿'<>'쌍을 닫는 토큰 ('''토큰은 C++ 0x 전용입니다.)이 수정되었습니다. –
@Charles : 하! 네, 아마도 많은 답변에서 그렇게하겠습니다. 나는'>>'을 지원하는 컴파일러를 사용하는 데 익숙하다. –
+1 :'std :: pair :: operator <()'에 과부하가 걸렸다는 것을 몰랐습니다. 지금 할게! –