访问嵌套对

时间:2009-09-22 10:25:05

标签: c++ boost std tr1 std-pair

拆开一对,可以完成以下操作

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

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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 )
)