检查shared_ptr的容器是否包含一个指针?

Use*_*ser 3 c++ shared-ptr observer-pattern

使用观察者模式。我有一个类,例如Monitor,它监视对象的集合。该类是一个Observer,其集合中的每个对象都是Subject。当前,该集合被实现为shared_ptr的std :: list。在Monitor类的Update方法中,我要检查更新是否来自其集合中的对象之一。

std::list<SomeSharedPointer> items_;
...
void Monitor::Update(Subject *subject)
{
    if(subject == something_)
    {
        DoSomething();
    }
    else if
    ??
    // if subject is one of the objects in our collection then do something..

}
Run Code Online (Sandbox Code Playgroud)

这里的主题是原始指针,我的集合是shared_ptr的列表。如何有效检查进入的主题是否是集合中的任何对象?

(请注意,如果有算法解决方案需要一个,则我的编译器msvc将支持lambda)

更新

我应该补充一点,我意识到我可以在容器上使用for循环,但是我想知道是否有一种时髦的方法。

更新2

SomeSharedPointer为一个typedef std::shared_ptr<SomeType>其中SomeType从抽象类派生Subject(标准观察者模式实现)。SomeType将在某个时候调用Notify(),这将为Update()每个观察者调用该方法。

Ale*_* C. 5

auto i = std::find_if(items_.begin(), items_.end(), 
    [=](const SomeSharedPointer& x) { return x.get() == subject; });

if (i != c.end())
{ 
    // Object found, and i is an iterator pointing to it
}
Run Code Online (Sandbox Code Playgroud)

一些辅助方法可以使此方法更具可读性:

typedef std::list<SomeSharedPtr> ObserverCollection;

// You can also add a const version if needed
ObserverCollection::iterator find_observer(Subject* s)
{
    return std::find_if(items_.begin(), items_.end(), 
        [=](const SomeSharedPointer& x) { return x.get() == s; });
}
Run Code Online (Sandbox Code Playgroud)

然后,如果需要迭代器,可以像这样使用它

auto i = find_observer(subject);
if (i != items_.end())
{
    // Object found
}
Run Code Online (Sandbox Code Playgroud)

或只是简单地像这样,如果您不这样做:

if (find_observer(subject) != items_.end())
{
    ...
}
Run Code Online (Sandbox Code Playgroud)