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()));

ここで 2 番目の問題があります。アプリケーションの実行中に user_info のステータス bool が変更される可能性があり、後で補足マップに含まれているだけでなく、true のステータス bool を持つアイテムでベクトルを再分割したいと考えています。 .

ただし、ネストされたペアの 2 番目の項目へのアクセスに問題があるようです。

次のことを試しましたが、ネストされたペアにアクセスできないようです!

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);
4

2 に答える 2

4

そこで何が起こっているのかよくわかりませんが、通常、bind で問題が発生し始めると、あきらめてファンクターを実装します。これにより、あなたの場合は簡単になるかもしれません。

私にとって、以下は、複数レベルのバインドをいじるよりもはるかに読みやすいです

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);
于 2009-09-22T13:14:19.143 に答える
1

使用した構文は明らかに機能しません。最初の "::second" は、型ではなく非静的メンバーを既に示しています。ペアの中にペアがある場合は、おそらく 2 つのバインド呼び出しを使用する必要があります。

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 )
) )

(私はこれをテストしませんでした。おそらくこれがあなたが望むものです)

しかし、私の意見では、バインドする場合の 3 つのレベルは非常に困難です。

編集:これはどうですか?

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 )
)
于 2009-09-22T13:13:40.813 に答える