C++ Boost shared_ptr示例程序

C++ Boost shared_ptr示例程序,c++,boost,foreach,shared-ptr,C++,Boost,Foreach,Shared Ptr,我试图熟悉boost共享ptr。我遇到了下面的例子 #include <vector> #include <set> #include <iostream> #include <algorithm> #include <boost/shared_ptr.hpp> /* The application will produce a series of * objects of type Foo which later must be

我试图熟悉boost共享ptr。我遇到了下面的例子

#include <vector>
#include <set>
#include <iostream>
#include <algorithm>
#include <boost/shared_ptr.hpp>

/*  The application will produce a series of
*  objects of type Foo which later must be
*  accessed both by occurrence (std::vector)
*  and by ordering relationship (std::set).
*/

struct Foo
{
    int x;

    Foo( int y ) : x(y)
    {

    }
    ~Foo()
    {
        std::cout << "Destructing a Foo with x=" << x << "\n";
    }
};

typedef boost::shared_ptr<Foo> FooPtr;

struct FooPtrOps
{
    bool operator()( const FooPtr & a, const FooPtr & b )
    {
        return true; //a->x > b->x;
    }
    void operator()( const FooPtr & a )
    {
        std::cout << a->x << "\n";
    }
};

int main()
{
    std::vector<FooPtr>         foo_vector;
    std::set<FooPtr,FooPtrOps>  foo_set; // NOT multiset!

    FooPtr foo_ptr( new Foo( 2 ) );
    foo_vector.push_back( foo_ptr );
    foo_set.insert( foo_ptr );

    foo_ptr.reset( new Foo( 1 ) );
    foo_vector.push_back( foo_ptr );
    foo_set.insert( foo_ptr );

    foo_ptr.reset( new Foo( 3 ) );
    foo_vector.push_back( foo_ptr );
    foo_set.insert( foo_ptr );

    foo_ptr.reset ( new Foo( 2 ) );
    foo_vector.push_back( foo_ptr );
    foo_set.insert( foo_ptr );

    std::cout << "foo_vector:\n";
    std::for_each( foo_vector.begin(), foo_vector.end(), FooPtrOps() );

    std::cout << "\nfoo_set:\n";
    std::for_each( foo_set.begin(), foo_set.end(), FooPtrOps() );
    std::cout << "\n";

    return 0;
}

我想它只是想告诉你
4
对象被实例化,
2
不同的容器每个都包含所有
4
对象(即相同的
4
对象),最后只有
4
对象被销毁。还要注意
FooPtrOps()
是默认构造的FooPtrOps对象。这就是传递到
foreach
函数的内容。在
foreach
内部,它调用operator()(const FooPtr&a)成员函数。@anomail-for_每个循环文档都指出第三个参数应该是lambda函数(不是对象?)@liv2hak文档声明它是一个模板类型,满足一元函数的要求(即,一个函数对象、一个函数和一个lambda都可以工作)。@liv2hak看到了。
foo_vector:
2
1
3
2

foo_set:
2
3
1
2

Destructing a Foo with x=2
Destructing a Foo with x=1
Destructing a Foo with x=3
Destructing a Foo with x=2