mem_func和for_each用法

时间:2011-09-30 05:52:32

标签: c++ std

如何使用std::for_each调用类成员函数 这是我的课程。

template <typename _TyG>
class Graph {
private:        
public:
    typedef typename Vertex<_TyG>                           VertexType;
    typedef typename std::set<VertexType>                   GraphStorage;
    typedef typename GraphStorage::iterator                 GraphStorageItr;
    typedef typename GraphStorage::const_iterator           GraphStorageConstItr;

    typedef typename std::list<VertexType *>                AdjListType;
    typedef typename AdjListType::iterator                  AdjListTypeItr;
    typedef typename AdjListType::const_iterator            AdjListTypeConstItr;

    typedef typename std::map<  VertexType*, 
                                AdjListType, 
                                CompareIterator<VertexType*> >  GraphType;

    typedef typename GraphType::iterator                    GraphTypeItr;
    typedef typename GraphType::const_iterator              GraphTypeConstItr;

void _init_not_visited(GraphTypeItr inItr) {
}
void DepthFirstSearch() {
        std::for_each(m_Graph.begin(), m_Graph.end(), std::bind2nd(std::mem_fun(&Graph::_init_not_visited),this));
    }
}

我想要的是将迭代器传递给_init_not_visited。但我对如何使用std::for_each感到困惑,目前的代码给了我编译错误。

1 个答案:

答案 0 :(得分:2)

我认为你不能用std :: for_each做你想做的事情。由于std :: for_each在序列中的每个值上调用给定函数,而不是序列中的每个迭代器位置。 std :: for_each可能看起来像:

template <class iter_t, class fn_t>
fn_t for_each(iter_t first iter_t const last, fn_t fn)
{
    for (; first != last; ++first)
        fn(*first);
    return fn;
}

您可以编写自己的for_each_iter,例如:

template <class iter_t, class fn_t>
fn_t for_each_iter(iter_t first, iter_t const last, fn_t fn)
{
    for (; first != last; ++first) {
        fn(first);
    }

    return fn;
}

或者更改_init_not_visited()以使用GraphType :: value_type而不是GraphTypeItr。假设您仍然可以使用该参数编写函数。