【问题标题】:Accessing a nested pair访问嵌套对
【发布时间】:2009-09-22 10:25:05
【问题描述】:

要拆开一对,可以做到以下几点

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

【问题讨论】:

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


    【解决方案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);
    

    【讨论】:

    • 当然。 Bind 在简单的情况下很好用,有时 boost::tie 可能会有所帮助,但是当语法过于繁琐时,请改为编写自己的仿函数。
    【解决方案2】:

    您使用的语法显然不起作用。第一个“::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 )
    )
    

    【讨论】:

    • 正如 Glen 所说,编写自己的类作为谓词可能会更好。从您的代码中不清楚您要做什么。 find 返回一个不是对的迭代器。 (取消引用缺失)
    • 你说得对,我后来才意识到这一点。但是现在我比以前更困惑了。在我的第一次分区调用中,绑定调用返回了一个迭代器。正如你所说的 find 在迭代器中返回,但它的函数参数是一个值,而不是一个迭代器,那么向量迭代器是如何被取消引用的?我想我想要的是取消引用会产生一对的迭代器,然后我想将这对的 .second 部分与 true 进行比较
    • 我不知道你想要什么。 find 返回一个比较等于 USER_MAP.end() 的迭代器的情况呢?
    • 向量中永远不会有任何项目不在地图中。这一先决条件已在较早时强制执行。第二个分区基于值(不是键)发生变化的数据,不会从映射或向量中删除任何键
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    • 2012-11-12
    • 2011-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多