2013-11-22 3 views
1

벡터 < 쌍 < 문자열, 쌍 < int,>> < int, int>의 첫 번째 요소를 기준으로 다음 벡터를 정렬 할 수있게하려면 다음 벡터를 정렬 할 수 있어야합니다. 두 번째 요소는 STL의 구문을 사용하여 C++에서 어떻게 처리합니까? E1.second.first == E2.second.first 다음 비교가 이루어져야 경우벡터를 정렬하는 방법 <pair <string, pair <int , int> >>?

이런 종류의 E1과 E2가이 개 요소

는 말할 수이

의 라인에 뭔가를 달성한다 제 2 요소에 대하여

답변

2

당신이 C++ 11 개 기능을 사용할 수없는 경우 당신은 여전히이 같은 작업을 수행 할 수 있습니다

typedef std::pair<std::string, std::pair<int, int>> AnkitSablok; 

struct my_compare { 
    bool operator()(const AnkitSablok &lhs, const AnkitSablok &rhs) const { 
     return lhs.second < rhs.second; 
    } 
}; 

int main() 
{ 
    std::vector<AnkitSablok> vec; 

    std::sort(vec.begin(), vec.end(), my_compare()); 
} 
+0

그것은 일했다 : D, 그런 중대한 대답을위한 blastfurnace에게 감사하십시오 : D, 너에게 일반적으로 그런 일을 달성하는 방법을 설명 할 수 있는다? 어떤 이론은 유용 할 것입니다 :) – AnkitSablok

+1

[C++ 03 로컬 클래스는 템플릿 인수로 사용할 수 없습니다] (http://stackoverflow.com/a/5751990/1762344). –

+0

@EvgenyPanasyuk : 고마워, 내가 엄격하게 C++ 03 컴파일러를 사용한 이후로 꽤 오래되었습니다. – Blastfurnace

0
sort(x.begin, x.end, [](const X & a, const X & b){return a.second.first < b.second.first ; }) ; 

여기서 x는 컨테이너이고 X는 요소 유형입니다.

+0

방금 ​​한 내용을 설명해 주시겠습니까? – AnkitSablok

+0

또한 오타를 수정할 수 있습니까? c : –

+0

비교 함수로 사용되는 표준 라이브러리 + 람다 함수의 정렬 함수입니다. – zoska

2

[...] 쌍의 첫번째 요소를 기반으로 < INT, INT>

template <class T1, class T2> 
bool operator<(const pair<T1, T2>& x, const pair<T1, T2>& y); 

Returns: x.first < y.first || (!(y.first < x.first) && x.second < y.second) 
: 그 같으면 다음

std::pair 이미 사전 식 비교 C++ 03 20.2.2/6을 가진다 [...] 두 번째 요소에 따라 그들을 정렬

WhozCraig이 지적했듯이, 바깥 쪽 쌍의 .second을 비교해야합니다.

이것은 람다 식으로, 나는 C++ 11을 가지고 있지 않다. 가능한 다른 방법은 없을까?

사용 펑터 :

struct LessSecond 
{ 
    template<typename T, typename U> 
    bool operator()(const std::pair<T,U> &x, const std::pair<T,U> &y) const 
    { 
     return x.second < y.second; 
    } 
}; 
// ... 
sort(x.begin(), x.end(), LessSecond()); 

아니면 더 일반적인 버전 (필요에 따라) :

struct LessSecondGeneric 
{ 
    template<typename Pair> 
    bool operator()(const Pair &x, const Pair &y) const 
    { 
     return x.second < y.second; 
    } 
}; 

LIVE DEMO :

#include <algorithm> 
#include <iostream> 
#include <iterator> 
#include <utility> 
#include <vector> 

struct LessSecond 
{ 
    template<typename T, typename U> 
    bool operator()(const std::pair<T,U> &x, const std::pair<T,U> &y) const 
    { 
     return x.second < y.second; 
    } 
}; 

int main() 
{ 
    using namespace std; 

    vector<pair<string , pair<int, int>>> x 
    { 
     {"1", {2, 1}}, {"2", {1, 1}}, {"3", {1, 2}} 
    }; 
    sort(x.begin(), x.end(), LessSecond()); 
    for(const auto &p : x) 
     cout << p.first << " (" << p.second.first << ", " << p.second.second << ")" << endl; 
} 

출력은 다음과 같습니다

2 (1, 1) 
3 (1, 2) 
1 (2, 1) 
+0

확인. 혼수 상태에 OP를 넣을 것이지만, 나는 그것을 좋아하지 않는다. 특히 그것이 일반적이기 때문에. 나는 내 대답을 버리고있다. +1 – WhozCraig

관련 문제