2009-09-22 164 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可以改變,後來我想重新分區與狀態布爾值爲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返回一個不是一對的迭代器。 (引用缺失) – sellibitze 2009-09-22 13:53:35

+0

你的權利,我後來意識到這一點。但現在我比以前更困惑了。在我第一次調用分區時,綁定調用正在返回一個迭代器。正如你所說的在迭代器中查找返回值,但其函數參數是一個值,而不是迭代器,那麼向量迭代器如何解除引用? 我想我想要的是取消引用會導致一對的迭代器,然後我想比較真正的 – 2009-09-22 14:46:57

+0

對的第二部分。我不知道你想要什麼。如果find返回一個比較等於USER_MAP.end()的迭代器呢? – sellibitze 2009-09-22 15:00:52

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 2009-09-22 14:13:21

+0

+1對於退出嘗試有點不同。 – 2009-09-23 10:25:56