2009-09-22 5 views
0

떨어져 쌍을하려면 중첩 된 쌍을 액세스, 다음과 같은 서로 다른 컨테이너의 조합을 사용하는 방법에 대한

boost::bind(&std::pair::second, _1); // returns the value of a pair 

무엇

을 수행 할 수 있습니다, 어떻게 중첩 된 쌍에 액세스 할 수 있습니까? 나는 보충지도에 포함되지 않은 것을 보충지도에 포함 된 항목 및 항목에 벡터를 분할하고 싶었 예를 들어

나는 다음과 같은 사용 : 이제

typedef int DWORD; typedef std::pair<std::string, bool> user_info; 
typedef std::map<DWORD, user_info> USER_MAP; 
typedef std::vector<DWORD> VEC_STAFF; 
VEC_STAFF::iterator it = std::partition(
    Staff.begin(), Staff.end(), 
    (bind(&USER_MAP::find, m_Users, _1) != m_Users.end())); 

내가 두 번째 문제가 - 중 user_info의 상태 bool이 변경 될 수있는 응용 프로그램의 실행과 나중에 보충 맵에 포함되지 않고 상태 bool이 true 인 항목으로 벡터를 다시 분할하려고합니다.

그러나 중첩 된 쌍의 두 번째 항목에 액세스하는 데 문제가있는 것 같습니다.

다음을 시도했지만 중첩 된 쌍에 액세스 할 수 없습니다!

VEC_STAFF::const_iterator itCurEnd = partition(Staff.begin(), Staff.end(), 
    bind(&USER_MAP::value_type::second::second, 
    bind(&USER_MAP::find, &m_Users, _1)) == true); 

답변

1

분명히 사용한 구문이 작동하지 않습니다. 첫 번째 ":: second"는 이미 유형이 아닌 비 정적 멤버를 나타냅니다. 바인드가 상당히 경우

그러나 세 가지 수준 (아마도 이것은 당신이 원하는 내가 이것을 테스트하지 않았습니다.)

typedef std::pair< int, bool > foo_t; 
typedef std::pair< int, foo_t > bar_t; 
..... 

bind(&foo_t::second, bind(&bar_t::second, 
    bind(&USER_MAP::find, _1) 
)) 

: 당신이 한 쌍의 내부에 한 쌍의가 있다면 당신은 아마이 바인드 호출을 사용해야 도전해라, 내 의견으로는.

편집 : 어때?

template<typename Iter, typename Return> 
struct deref_2nd_2nd : std::unary_function<Iter, Return> { 
    Return operator()(Iter const& it) const { 
     return (*it).second.second; 
    } 
}; 

..... 

bind(
    deref_2nd_2nd<USER_MAP::iterator,bool>(), 
    bind(&USER_MAP::find, _1) 
) 
+1

의 여러 수준의 장난에 비해 읽기 훨씬 쉽게, 그것은 조건으로 자신의 클래스를 작성하는 아마 좋습니다. 당신의 코드에서 당신이 무엇을하려했는지 확실하지 않습니다. find는 쌍이 아닌 반복자를 반환합니다. (Dereferencing is missing) – sellibitze

+0

당신의 권리, 나는 이것을 나중에 깨달았습니다. 하지만 지금은 전보다 훨씬 더 혼란 스럽습니다. partition에 대한 첫 번째 호출에서 바인드 호출은 반복자를 반환합니다. find 반복자에서 리턴 값을 말하지만 함수 인자는 반복자가 아닌 값이며 그래서 벡터 반복자는 어떻게 참조 해제됩니까? 내가 원하는 것은 반복자를 역 참조하는 것이고 그 다음에 쌍을 생성하는 반복자를 참조한 다음 쌍의 두 번째 부분을 참과 비교하려고합니다. –

+0

내가 원하는 것이 무엇인지 알 수 없습니다. find가 USER_MAP.end()와 동일한 이터레이터를 반환하는 경우는 어떻습니까? – sellibitze

4

잘 모르겠습니다. 일반적으로 내가 문제를 일으키기 시작하면 바인더를 포기하고 구현합니다. 이것은 귀하의 경우에 단순화 할 수 있습니다. 나에게

은 다음 모든 것을 글렌 말했듯이 바인딩

template <class Arg> 
struct Whatever : public std::unary_function<Arg, bool> 
{ 
    bool operator()(const Arg &arg1) const { 
     //logic here 
    } 
}; 

Whatever<???> functor; 
std::partition(Staff.begin(), Staff.end(), functor); 
+0

입니다. 간단한 경우에는 바인딩을 사용하는 것이 좋으며 때로는 boost :: tie가 도움이 될 수 있지만 구문이 너무 털이 없어지면 대신 자신의 펑터를 작성하십시오. – jalf

+0

+1 백 아웃을 위해 약간 다른 시도를 해보십시오. –