C++ 访问嵌套对

C++ 访问嵌套对,c++,boost,std,tr1,std-pair,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<

要拆开一对,可以执行以下操作

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

您使用的语法显然不起作用。第一个“::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 )
) )
typedef std::pairfoo\t;
typedef std::pairbar\t;
.....
绑定(&foo\u t::second),绑定(&bar\u t::second,
绑定(&U)用户映射::查找,_1)
) )
(我没有测试这个。也许这就是你想要的)

但在我看来,bind的三个级别相当具有挑战性

编辑:这个怎么样

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 )
)
模板
结构deref_2nd_2nd:std::一元函数{
返回运算符()(Iter常量和it)常量{
返回(*it)。秒。秒;
}
};
.....
束缚(
deref_2nd_2nd(),
绑定(&U)用户映射::查找,_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 )
) )
typedef std::pairfoo\t;
typedef std::pairbar\t;
.....
绑定(&foo\u t::second),绑定(&bar\u t::second,
绑定(&U)用户映射::查找,_1)
) )
(我没有测试这个。也许这就是你想要的)

但在我看来,bind的三个级别相当具有挑战性

编辑:这个怎么样

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 )
)
模板
结构deref_2nd_2nd:std::一元函数{
返回运算符()(Iter常量和it)常量{
返回(*it)。秒。秒;
}
};
.....
束缚(
deref_2nd_2nd(),
绑定(&U)用户映射::查找,_1)
)

我不确定我是否了解那里的情况,但通常当我开始遇到绑定问题时,我会放弃并实现一个函子。这可能会简化您的情况

对我来说,下面的内容要比在多个绑定级别上乱搞容易读得多

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);
模板
struct where:public std::一元函数
{
布尔运算符()(常量Arg和arg1)常量{
//这里的逻辑
} 
};
任何函子;
std::partition(Staff.begin()、Staff.end()、functor);

我不确定我是否了解那里的情况,但通常当我开始遇到绑定问题时,我会放弃并实现一个函子。这可能会简化您的情况

对我来说,下面的内容要比在多个绑定级别上乱搞容易读得多

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);
模板
struct where:public std::一元函数
{
布尔运算符()(常量Arg和arg1)常量{
//这里的逻辑
} 
};
任何函子;
std::partition(Staff.begin()、Staff.end()、functor);

正如Glen所说,最好编写自己的类作为谓词。你的代码不清楚你想做什么。find返回一个不是成对的迭代器。(取消引用缺失)你的权利,我后来意识到了这一点。但现在我比以前更困惑了。在我对分区的第一次调用中,bind调用返回一个迭代器。正如您所说,find在迭代器中返回,但是它的函数参数是一个值,而不是迭代器。那么向量迭代器是如何被解引用的呢?我想我想要的是取消对迭代器的引用,这将产生一对迭代器,然后我想将这对迭代器的第二部分与真迭代器进行比较,我不知道你想要的是什么。如果find返回一个迭代器,该迭代器与USER_MAP.end()进行比较,那么这种情况会怎样?向量中永远不会有任何项不在映射中。这一先决条件在早些时候就得到了执行。第二个分区基于值(而不是键)中已更改的数据,不会从映射中删除任何键,或者向量,正如Glen所说,最好编写自己的类作为谓词。你的代码不清楚你想做什么。find返回一个不是成对的迭代器。(取消引用缺失)你的权利,我后来意识到了这一点。但现在我比以前更困惑了。在我对分区的第一次调用中,bind调用返回一个迭代器。正如您所说,find在迭代器中返回,但是它的函数参数是一个值,而不是迭代器。那么向量迭代器是如何被解引用的呢?我想我想要的是取消对迭代器的引用,这将产生一对迭代器,然后我想将这对迭代器的第二部分与真迭代器进行比较,我不知道你想要的是什么。如果find返回一个迭代器,该迭代器与USER_MAP.end()进行比较,那么这种情况会怎样?向量中永远不会有任何项不在映射中。这一先决条件在早些时候就得到了执行。第二个分区基于值(而不是键)中已更改的数据,不会从映射或向量中删除任何键。Bind在简单的情况下很好,有时boost::tie会很有帮助,但是当语法变得太复杂时,可以编写自己的functor。Bind在简单的情况下很好,有时boost::tie会很有帮助,但是当语法变得太复杂时,可以编写自己的functor。